c#删除dialogresult

c# Delete dialogresult

如何删除 DialogResult 对象? 我将其用作清除表单的确认(删除所有控件并重新初始化控件)。问题是,当我点击是时,它会重新创建第二个 DialogResult,然后是第三个,然后是第四个,等等。

所以当用户点击是时,我想删除这个 DialogResult。有办法吗?

代码在这里:

private void GUI_DCP_FormClosing(object sender, FormClosingEventArgs e)
    {

        var confirmation_text = "If you click 'Yes', all information will be discarded and form reset. If you want to save the input click 'No' and then 'Save'";

        DialogResult dialogResult = MessageBox.Show(confirmation_text, "WARNING", MessageBoxButtons.YesNo);
        if (dialogResult == DialogResult.Yes)
        {
            this.Hide();
            e.Cancel = true; // this cancels the close event.
            this.Controls.Clear();
            this.InitializeComponent();
            this.Height = 278;
            this.Width = 341;
        }
        else
        {
            e.Cancel = true;
        }
    }

当您回忆起 InitializeComponent 时,您不仅是在重新添加控件,而且还在重新添加所有事件处理程序 INCLUDING 链接到表单本身的事件处理程序(FormClosing 事件和其他事件,如果存在的话)。

这样,第一次调用似乎很顺利,但第二次注册了FormClosing事件处理程序。因此,当您触发进入 FormClosing 事件处理程序的操作时,它会被调用两次,并且在同一次调用中,它将再次注册,并在下一次调用时进行三次等等。

停止此行为的最简单方法是在调用 InitializeComponent 之前删除 FormClosing 事件处理程序

if (dialogResult == DialogResult.Yes)
{
    this.Hide();
    e.Cancel = true; 

    // This removes the FormClosing event handler.
    // If other event handlers are present you should remove them also.
    this.FormClosing -= GUI_DCP_FormClosing;   

    this.Controls.Clear();
    this.InitializeComponent();
    this.Height = 278;
    this.Width = 341;

    // Do not forget to reshow your hidden form now.
    this.Show();
}

但我真的不认为清除控件集合并再次调用 InitializeComponent 是个好主意。
如果您有许多事件处理程序,您应该在调用 InitializeComponent 之前将它们全部删除,除此之外,这种方法会影响您的性能和内存占用。

相反,我会准备一个包含所有动态添加的控件的列表,然后将它们一一删除。其次,我会编写一个程序来将固定控件重置为其初始值,而无需将它们从控件集合中移除并一次又一次地读取它们。