表单与MdiParent组合打开两次相同的表单

时间:2016-08-04 16:17:41

标签: c# winforms

我有一个表单(MdiParent),代码如下:

public partial class Main : Form
{
  Form1 frm1 = null; 
  Form2 frm2 = null;
}

通过几个菜单,我会执行以下操作:

private void toolStripMenuItem_ClickForm2(object sender, EventArgs e)
{
     if(frm2 == null)
     {
       frm2 = new Form2(frm1);
       frm2.MdiParent = this;
     }   
   frm2.Show();
}


private void toolStripMenuItem_ClickForm1(object sender, EventArgs e)
{
     if(frm1 == null)
     {
       frm1 = new Form1();
       frm1.MdiParent = this;
     }
   frm1.Show();
}

如果我单击menuitemForm2在form2中执行某些操作(DB访问并填充DatagridView,frm1永远不会在frm2中初始化),然后单击menuitemForm1以显示frm1。它将产生两个相同形式的窗口1。

之前有没有人遇到过这种奇怪的行为?

附录因为评论......

frm2使用frm1执行类似的操作:

 Form1 frm ;

 public Form2(Form1 form1)
 {
   frm = form1;
 }

 public void Optionalmethod()
 {
   if(frm == null)
   {
     frm = new Form1();
     frm.MdiParent = this.MdiParent;
   }
   frm.Show();
 }
测试期间未执行

Optionalmethod()

根据我的逻辑,form1可以在两种情况下初始化:

 1. Inside form2 
 2. In the Main form 

对于我而言,初始化form1的位置并不重要,但这很重要 只有一个实例。这就是原因,因为我决定传递引用,即使它是null

1 个答案:

答案 0 :(得分:1)

我一直无法复制你的问题,但无论如何我会建议一个替代方案。我个人并不赞成在子表单之间传递表单变量。有一个更简洁的方法来做到这一点。用

替换你的代码
private void toolStripMenuItem_ClickForm1(object sender, EventArgs e)
{
    ShowForm1();
}

    public void ShowForm1()
    {
        try
        {
            if (frm1 == null)
            {
                frm1 = new Form1();
                frm1.MdiParent = this;
            }
            else if (frm1.MdiParent == null)
            {
                frm1 = new Form1();
                frm1.MdiParent = this;
            }
            frm1.Show();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

请注意额外的其他情况。如果已创建并关闭表单,则引用不为null,但其MdiParent属性将为null。

现在删除Form2构造函数中的Form1参数(加上私有成员)并将OptionalMethod代码替换为:

        var parent = (MainForm)this.MdiParent;
        parent.ShowForm1();

这应该可以正常工作。

HTH

乔纳森