如何在关闭时第二次打开表格&它已经打开时不应再打开

时间:2013-07-06 07:34:49

标签: c# .net

我使用c#.net 2.0和oracle 10g

进行窗口应用

我有一个表格名称FORM1 with menustrip

从FORM1的menustrip,我打开另一个表格FORM2并在使用后关闭相同的FORM2 但如果我第二次点击它就没有显示

我还添加了一些代码,如果用户在关闭相同的FORM2之前第二次按下相同的menustrip按钮,则不应打开并将已打开的FORM2置于焦点

编辑::
第一次尝试-----------------

private void openToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    FORM2 f2 = Application.OpenForms["FORM2"] as FORM2 ; 
    if (f2 != null) 
    { 
        f2 .WindowState = FormWindowState.Normal; 
        f2 .BringToFront(); 
        f2 .Activate(); 
    } 
    else 
    { 
        f2 = new FORM2(); 
        f2.Show(); 
    } 
} 

第二次尝试--------------

private void FORM2_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    this.Hide(); 
    e.Cancel = true; 
} 

使用此代码,当用户多次点击menustrip时,我可以多次打开相同的FORM2 ..我不希望发生这种情况

第三次尝试------------

private void openToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    FORM f2 = new FORM2(); 
    f2.Show(); 
} 

此代码也与第二次尝试相同

第四次尝试--------------

private FORM2 f2 = null; 
private void openToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    if (f2 == null) 
    { 
        f2 = new FORM2(); 
    } 
    f2.Show(); 
    f2.Activate(); 
} 

我已经尝试了以上所有编码,但我无法得到我所期待的......你能不能找到&帮助我,我在这里失踪了..

1 个答案:

答案 0 :(得分:2)

Application.OpenForms集合不可靠。当您更改表单的某些属性(如ShowInTaskbar属性)时,表单实例将从该集合中消失而无需跟踪。这是Winforms中一个众所周知的错误,可能是您无法完成原始尝试的原因。

可靠的替代方法是自己跟踪表单实例的生命周期。像这样:

    private Form Form2Instance;

    private void openToolStripMenuItem_Click(object sender, EventArgs e) {
        if (Form2Instance == null) {
            Form2Instance = new FORM2();
            Form2Instance.FormClosed += (s, ea) => Form2Instance = null;
        }
        Form2Instance.WindowState = FormWindowState.Normal;
        Form2Instance.Show();
        Form2Instance.BringToFront();
    } 

收听FormClosed事件并将引用设置为null是解决方案的关键部分。