在 windows 窗体 (c#) 中,当用户单击按钮时,我正在显示一个窗体,它工作正常窗体对用户可见,但如果用户再次单击同一个按钮,同一个窗体将再次打开,两个窗体正在显示。有什么办法可以防止这种情况,请给我任何参考,谢谢。这是我的代码....
private void button1_Click(object sender, EventArgs e)
{
Form2 obj = new Form2();
obj.Show();
}
你最有可能做这样的事情:
void button1_OnClick(object sender, EventArgs e) {
var newForm = new MyForm();
newForm.Show();
}
因此,每次单击时都会显示表单的新实例。你想做这样的事情:
MyForm _form = new MyForm();
void button1_OnClick(object sender, EventArgs e) {
_form.Show();
}
在这里,您只有一个要显示的表单实例,只需 Show() 即可。
foreach (Form form in Application.OpenForms)
{
if (form.GetType() == typeof(MyFormType))
{
form.Activate();
return;
}
}
Form newForm = new MyFormType();
newForm.MdiParent = this;
newForm.Show();
我尝试了多种方法来比较哪个更好。
但我认为这个解决方案一定比答案更好。
你可以尝试类似的东西
private Form f;
private void button2_Click(object sender, EventArgs e)
{
if (f == null)
{
f = new Form();
f.Closed += f_Closed;
f.Show();
}
}
void f_Closed(object sender, EventArgs e)
{
f = null;
}
您很可能每次都在 Button 的 Click 处理程序中创建一个新的表单实例。
因此,您需要将 Form 对象的创建移到Button_Click
.
解决问题的最简单方法是用 ShowDialog 替换 Show 命令,这样在防止表单显示两次时不会有任何问题
Form2 obj = new Form2();
obj.ShowDialog();
代码:.ShowDialog();
是我们目前正在寻找的可以解决问题的代码
10 年后,喜欢乐队 :p 想分享对我有用的代码。没什么特别的,只是检查表单实例是否存在。另外,我不喜欢 ShowDialog,因为用户被“困”在那种形式中,我觉得它很烦人。用户可能想要检查其他来源的其他信息,例如在填写在线表格时需要复制粘贴字段信息。
private void button1_Click(object sender, EventArgs e)
{
var obj = Application.OpenForms.OfType<Form2>().Select(t => t).FirstOrDefault();
if (obj != null)
{
obj.BringToFront();
}
else
{
obj = new Form2();
obj.Show();
}
}
这是经过验证的解决方案的一个很好的示例,如果表单尚未打开,它将打开它。如果它已经打开,它将把它放在前台。
namespace MainProgram
{
public partial class Form1 : Form
{
private Form formNew = new FormToShowSomething();
private void button1_Click(object sender, EventArgs e)
{
formNew.Show();
formNew.Activate();
}
}
}