C# 删除对话框结果



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

因此,当用户点击是时,我想删除此对话结果。有办法吗?

在这里代码:

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

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

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

相关内容

  • 没有找到相关文章

最新更新