1

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

4

6 回答 6

4

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

if (!Application.OpenForms.OfType<Form2>().Any())
{
    Form2 form2 = new Form2();
    form2.Show();
}
于 2013-03-19T14:52:58.123 回答
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;
}
于 2013-03-19T14:56:43.500 回答
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();

并且由于他们实际上无法关闭表单,因此这将始终有效。

于 2013-03-19T14:53:55.990 回答
0

你可以尝试类似的东西

bool windowIsNotOpen;

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

if (!windowIsNotOpen)
{
    // Form2 is already open
    return;
}
于 2013-03-19T14:55:19.590 回答
0

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

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

每当您想打开它时,请先检查标志。

于 2013-03-19T14:57:13.293 回答
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 并检查打开了哪个

于 2013-03-19T14:57:58.377 回答