C# 在Windows窗体中关闭模式窗体的计时器
我有几个带有网格的无模式表单,用于在MDI Windows表单应用程序中显示数据(示例代码中为C# 在Windows窗体中关闭模式窗体的计时器,c#,winforms,timer,C#,Winforms,Timer,我有几个带有网格的无模式表单,用于在MDI Windows表单应用程序中显示数据(示例代码中为Form1)。每个表单都有一个按钮,可以使用ShowDialog(示例代码中的Form2)以模态方式打开另一个表单,该按钮允许编辑Form1中显示的数据。这些模式表单有一个取消按钮,通过将DialogResult设置为Cancel关闭表单而不保存更改 我想实现一个计时器,在用户登录应用程序经过一定时间后关闭所有表单。如果计时器在模态窗体打开时触发,则会出现问题 public partial class
Form1
)。每个表单都有一个按钮,可以使用ShowDialog
(示例代码中的Form2
)以模态方式打开另一个表单,该按钮允许编辑Form1
中显示的数据。这些模式表单有一个取消按钮,通过将DialogResult
设置为Cancel
关闭表单而不保存更改
我想实现一个计时器,在用户登录应用程序经过一定时间后关闭所有表单。如果计时器在模态窗体打开时触发,则会出现问题
public partial class Form1 :
{ //Constructor ommited for brevity
private void btnEditData_Click(object sender, EventArgs e)
{
var form2 = new Form2();
timer1.Tick += (_, __) =>
{
form2.DialogResult = DialogResult.Cancel;
this.Close(); // this executes before form2.ShowDialog returns
};
timer1.Interval = 5_000;
timer1.Enabled = true;
form2.ShowDialog();
reloadData(); // here Form1 is already disposed because Close
// has been called on it. An exception is thrown as a consequence
}
private void reloadData()
{
if (this.IsDisposed)
// simulate using a disposed form
throw new ObjectDisposedException(this.Name);
}
}
我的意图是在form2.ShowDialog()
返回并且btnEditData\u Click
方法完成后,以某种方式安排调用Form1.Close()
,这样就不会有使用已处理表单的危险 编辑
看过代码后,我建议在Tick事件处理程序中引入第三个选项,用于决定是否必须关闭表单。例如,中止
timer1.Tick += (_, __) =>
{
form2.DialogResult = DialogResult.Abort;
};
if (form2.ShowDialog() == DialogResult.Abort) Close();
else reloadData();
第一个想法:保持简单和干净。您不必跟踪打开的表单,在MDI应用程序中,父表单的
MdiChildren
属性将为您提供所有表单。
然后,要处理结束部分,可以使用.Net中的现有功能
也许你可以发布一些代码,以帮助人们提供解决方案?根据@francesco-b建议发布一些代码