如何确保只打开一个表单实例?

时间:2013-03-19 14:50:48

标签: c# winforms

单击按钮,我打开一个新表单(比如Form2),但我不希望Form2打开超过1次。而且我不想使用.ShowDialog(),因为它不允许我转到上一个表单。我怎么能这样做?

6 个答案:

答案 0 :(得分:4)

您可以使用Application.OpenForms属性检查表单是否已打开:

if (!Application.OpenForms.OfType<Form2>().Any())
{
    Form2 form2 = new Form2();
    form2.Show();
}

答案 1 :(得分:2)

您可以显示现有表单而不是创建新表单:

Form2 _form2 = null;

void Button1_Click(object sender, EventArgs e) 
{    
     if (_form2 == null)
     {
         _form2 = new Form2();  
         _form2.Closed += Form2_Closed;
     } 

     _form2.Show();
     _form2.BringToFront(); 
 }

private void Form2_Closed(object sender, System.EventArgs e)
{
    _form2 = null;
}

答案 2 :(得分:0)

您可以发出Show方法,该方法会显示表单并允许用户返回表单,但您还可以覆盖表单的OnClosing事件:

protected override void OnClosing(CancelEventArgs e)
{
    e.Cancel = true;
}

这将使用户无法逐字地关闭表单。最后,如果您愿意,可以在用户关闭表单时Hide表单:

protected override void OnClosing(CancelEventArgs e)
{
    e.Cancel = true;
    this.Hide();
}

然后你需要在第一个表单中保留该实例,以便在单击按钮时可以重新显示它。因此,在第一种形式中,您可能会有一个类字段:

private Form2 _form2 = new Form2();

然后在按钮单击中它将如下所示:

_form2.Show();

因为它们实际上无法关闭表单,所以它总能正常工作。

答案 3 :(得分:0)

您可以尝试类似

的内容
bool windowIsNotOpen;

Mutex mutext = new Mutex(true, "Form2", out windowIsNotOpen);

if (!windowIsNotOpen)
{
    // Form2 is already open
    return;
}

答案 4 :(得分:0)

你可以做一个静态属性,告诉你它是否打开。您在打开表单时设置它,并在表单关闭时将其关闭。

class Form2 {
    public static bool IsOpen { get;set; }
    public Form2() {
        Load += (sender, e) => { Form2.IsOpen = true; };
        Closed += (sender, e) => { Form2.IsOpen = false; };
    }
}

每当你想打开它时,首先检查标志。

答案 5 :(得分:0)

    Form2 f;

    bool isOpen = false;
    private void button1_Click(object sender, EventArgs e)
    {
        if (f == null)
        {
            f = new Form2(); ;
            f.FormClosed += new FormClosedEventHandler(f_FormClosed);
        }
        if (!isOpen)
        {
            isOpen = true;
            f.Show();
        }

    }

    void f_FormClosed(object sender, FormClosedEventArgs e)
    {
        isOpen = false;
    }
  

尝试此操作或使用Application.OpenForms并检查打开哪个