c#删除对话框结果

c#删除对话框结果,c#,dialogresult,initializecomponent,C#,Dialogresult,Initializecomponent,如何删除DialogResult对象? 我使用它作为清除表单的确认(删除所有控件并重新初始化控件)。问题是,当我点击yes时,它会重新创建第二个DialogResult,然后是第三个DialogResult,然后是第四个DialogResult,以此类推 所以当用户点击yes时,我想删除这个DialogResult。有办法吗 代码如下: private void GUI_DCP_FormClosing(object sender, FormClosingEventArgs e) {

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

所以当用户点击yes时,我想删除这个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时,不仅要从头添加控件,还要重新添加所有事件处理程序,包括链接到表单本身的事件处理程序(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();
}
但是我真的不认为清除controls集合并再次调用InitializeComponent是一个好主意。
如果您有许多事件处理程序,那么在调用InitializeComponent之前应该将它们全部删除,除此之外,这种方法还会影响您的性能和内存占用


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

您能显示触发此行为的代码吗?。如果没有它,您的问题将无法回答,因为没有@Steve added code。因此,当您单击“是”时,将再次调用此代码,并立即显示第二个消息框?只是检查一下。如果用this.Controls.Clear和this.InitializeComponent注释掉这两行,会发生什么?无限循环是否停止?@Steve当我第一次点击yes时,一切正常,表单隐藏,控件重置(因为我也在动态创建新控件,所以当我点击yes时,我会像程序开始时那样重置)。但当我第二次显示此表单并点击X关闭此表单时,出现了两个确认框。我无法删除控件。请清除并初始化组件,因为这是将窗体重置为纯第一状态所需的,但DialogResult不属于控件,因此它不会被删除并重新读取。只创建了一个新的。DialogResult是枚举,而不是控件。它是在事件处理程序的堆栈上声明的,因此它与您实验的行为无关。代码中的某些内容导致第二次调用Form_Closing event Handler(非常感谢:),是的,您关于创建控件列表的说明很好。这是一个有趣的情况。我认为,如果你更新你的标题,更好地解释你的初始代码的行为,那么这个问题将被许多未来的读者搜索和发现。(正如我所说,结果与问题无关)