【发布时间】:2011-01-11 13:24:32
【问题描述】:
如何防止打开多个表单?
我在表单上显示 .show 但用户可以再次单击主表单和按钮,然后打开另一个表单实例。
【问题讨论】:
如何防止打开多个表单?
我在表单上显示 .show 但用户可以再次单击主表单和按钮,然后打开另一个表单实例。
【问题讨论】:
两个选项,取决于您的需要:
使用ShowDialog 代替Show,这将打开一个模式窗口。如果您不需要在子窗体打开时主窗体处于活动状态,这是显而易见的解决方案。
或者跟踪您已经在主窗体中打开的窗口,如果它已经打开,则不执行任何操作。如果您希望用户能够在子表单已打开的情况下使用主表单,则可能需要打开其他表单。
【讨论】:
做一些类似的事情:
SingleForm myform = null;
void ShowMyForm_Click(object sender, EventArgs e)
{ if (myform == null)
{
myform = new SingleForm();
}
myform.Show();
myform.BringToFront();
}
【讨论】:
强制你的表单对象遵守单例模式
【讨论】:
我更喜欢使用泛型和延迟加载来处理我的表单。由于我的所有表单都继承自一个基类,因此我可以使用相同的方法将表单带到前面、将它们发送到后面、销毁它们、启动它们等等。
如果您保留一个负责管理任何已加载表单的表单管理器类,您可以将任何您想要的表单放在最前面,或者阻止特定表单返回,除非满足某些条件。
public void LoadForm<T>() where T : MyNameSpace.MyBaseForm
{
// Load all your code in this joint and just call it when you
// need a form. In here, you can determine if a copy of the form
// already exists and then bring it forward or not
}
【讨论】:
禁用主窗体直到子窗体消失,或禁用按钮。
button_onClick(object Sender, EventArgs e)
{
Button btn = sender as Button;
btn.Enabled = false;
Form myform = new MyForm();
myform.Show();
}
当然,如果你想要模态行为,你真的应该使用form.ShowDialog() 而不是form.Show()。
【讨论】: