亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將 ShowDialog() 替換為 Show()

將 ShowDialog() 替換為 Show()

C#
墨色風雨 2022-08-20 15:57:41
我有一個使用ShowDialog()顯示的表單,因此它是一個模態窗口。private void OpenForm(object sender, ItemClickEventArgs e){    MyForm testForm = new MyForm();    ...    testForm.Enabled = true;    testForm.ShowDialog(this);    var dialogOk = testForm.DialogOK;    if(dialogOk)    {       //do some stuff 1    }}表單上有一個“確定”按鈕。單擊“確定”時,對話框“為 true”。在 MyForm 類中:private void OkClick(object sender, EventArgs e){   // do some stuff 2   ...    DialogOK = true;   Hide();}我需要將其轉換為非模式窗口。解決方案似乎是使用Show()而不是ShowDialog(),但是當我使用Show()時,代碼不會停止并等待單擊“確定”按鈕,因此永遠不會調用“做一些事情1”。使用 Show(),我如何在單擊“確定”按鈕后保持“做一些事情 1”的行為?更新:這是我現在正在嘗試的:public partial class MyForm: XtraForm{   public bool DialogOk;   private void OkClick(object sender, EventArgs e)   {      // do some stuff 2      ...       DialogOk = true;      Close();   }}方法 1:public partial class MyMainForm : XtraForm{   private MyForm testForm;   private void OpenForm(object sender, ItemClickEventArgs e)    {        if(testForm == null)        {            testForm = new MyForm();        }        ...        testForm.Enabled = true;        testForm.FormClosed += (s, a) => {            var dialogOk = testForm.DialogOk;            if (dialogOk)            {                // do some stuff 1            }        };        testForm.Show(this);    }}方法 2:public partial class MyMainForm : XtraForm{       private MyForm testForm;       private void OpenForm(object sender, ItemClickEventArgs e)        {            if(testForm == null)            {                testForm = new MyForm();            }            ...            testForm.FormClosed += testForm_Closed;            testForm.Show(this);        }        private void testForm_Closed(object sender, EventArgs args)        {            var testForm = (Form)sender;            testForm.Closed -= testForm_Closed;            if (testForm.DialogResult == DialogResult.OK)            {               // do some stuff 1            }        } }
查看完整描述

4 回答

?
UYOU

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

}


查看完整回答
反對 回復 2022-08-20
?
偶然的你

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);

}


查看完整回答
反對 回復 2022-08-20
?
12345678_0001

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();

    }

}


查看完整回答
反對 回復 2022-08-20
?
回首憶惘然

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();

    }

}


查看完整回答
反對 回復 2022-08-20
  • 4 回答
  • 0 關注
  • 145 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號