【发布时间】: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 的。