【问题标题】:Form opens two times the same form in combination with MdiParent表单与 MdiParent 结合打开两次相同的表单
【发布时间】:2016-08-04 16:17:40
【问题描述】:

我有一个包含以下代码的表单(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 中执行一些操作(数据库访问并填充 DatagridView,frm1 永远不会在 frm2 中初始化),然后单击 menuitemForm1 以显示 frm1。它将产生两个相同形式的窗口1。

以前有人遇到过这种奇怪的行为吗?

由于cmets的附录......

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

【问题讨论】:

  • 如果不点击 menuitemForm2 直接点击 menuitemForm1 会得到两个表单吗?如果是这样,听起来您将点击事件连接了两次。
  • 如果“frm1”尚未初始化和/或显示,您将 null 传递给 Form2 的构造函数。那么应该发生什么(它将如何获得对 Form1 的引用)?也许您应该在显示任何内容之前检查两者是否为空并实例化它们。此外,您没有在该处理程序中设置 Form1 的 MdiParent(您正在设置 Form2 的 MdiParent ......这可能为空!)。
  • @Idle_Mind 很好地抓住了第二个 MdiParent。错过了。 OP 可能不应该像那样传递表单,因为他们可能对存储在那里的“数据”更感兴趣。欢迎来到意大利面。
  • @LarsTech menuitemForm1 本身工作正常。只有在之前单击 menuitemForm2 时才会出现该问题
  • 那么你必须向我们展示你是如何在 Form2 中使用 Form1 的。

标签: c# winforms


【解决方案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);
        }
    }

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

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

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

这应该可以正常工作。

HTH

乔纳森

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    相关资源
    最近更新 更多