-1

我使用 c#.net 2.0 和 oracle 10g 做窗口应用程序

我有一个带有 menustrip 的表单名称 FORM1

从 FORM1 的菜单条中,我正在打开另一个表单 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; 
} 

使用此代码,当用户多次单击菜单条时,我可以多次打开相同的 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(); 
} 

我已经尝试了上述所有编码,但无法得到我所期望的..你们能找出并帮助我我在这里缺少什么..

4

1 回答 1

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 是解决方案的关键部分。

于 2013-07-06T10:02:41.280 回答