4 回答

TA貢獻1878條經驗 獲得超4個贊
您可以處理以下事件:Form.Closed
MyForm testForm = new MyForm();
testForm.Closed += testForm_Closed;
testForm.Show();
private void testForm_Closed(object sender, EventArgs args)
{
var testForm = (Form)sender;
testForm.Closed -= testForm_Closed;
if (testForm.DialogResult == OK)
// do some stuff 1
}

TA貢獻1841條經驗 獲得超3個贊
最簡單的方法是將代碼從 移動到事件處理程序 。但是,如果由于您可能希望對不同的任務使用相同的窗體,因此這不是放置代碼的好地方,則可以為事件添加一個處理程序,該處理程序在窗體關閉并運行代碼后調用,例如:OpenFormOkClickFormClosed
private void OpenForm(object sender, ItemClickEventArgs e)
{
MyForm testForm = new MyForm();
...
testForm.Enabled = true;
testForm.FormClosed += (s, a) => {
var dialogOk = testForm.DialogOK;
if(dialogOk)
{
//do some stuff 1
}
};
testForm.Show(this);
}

TA貢獻1802條經驗 獲得超5個贊
您可以使用綁定到 TaskCompletionSource 的異步事件處理程序,該處理程序偵聽并等待表單的關閉
private asyc void OpenForm(object sender, ItemClickEventArgs e) {
var source = new TaskCompletionSource<DialogResult>();
EventHandler handler = null;
handler = (s, args) => {
var form = (MyForm)s;
form.FormClosed -= handler;
source.SetResult(form.DialogResult);
}
var testForm = new MyForm();
testForm.FormClosed += handler; //subscribe
//...
testForm.Enabled = true;
testForm.Show();
var dialogOk = await source.Task;
if(dialogOk == DialogResult.Ok) {
//do some stuff 1
}
}
這樣,您就可以將邏輯保留在 中,并允許代碼在不阻塞的情況下等待。OpenForm
在表單中,單擊按鈕時,您需要做的就是設置對話框結果并關閉表單。
public partial class MyForm: XtraForm {
//...
private void OkClick(object sender, EventArgs e) {
// do some stuff 2
// ...
DialogResult = DialogResult.Ok;
Cose();
}
}

TA貢獻1847條經驗 獲得超11個贊
這對我有用,所以不知道為什么它不適合你(撓頭)......此窗體有兩個按鈕,一個按鈕再次打開同一窗體,另一個按鈕關閉窗體。“父”窗體將事件添加到“已關閉”事件。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Form1 test = new Form1();
test.FormClosed += Test_FormClosed;
test.Show();
}
private void Test_FormClosed(object sender, FormClosedEventArgs e)
{
MessageBox.Show("closed -- do something else here!");
}
private void button2_Click(object sender, EventArgs e)
{
Close();
}
}
- 4 回答
- 0 關注
- 145 瀏覽
添加回答
舉報