我有一个表单(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
答案 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
乔纳森