我有Form1
个2个单选按钮(rb1
和rb2
)和一个普通按钮(btn
)。当我点击btn
时,我应该打开Form2
,作为Form1
的MDI孩子,如果rb1
被选中,或者Dialog
rb2
Form2
检查。此外,任何时候都只能打开一个public partial class Form1 : Form
{
Form2 f2;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (f2 != null)
{
MessageBox.Show("Close form!");
return;
}
f2 = new Form2();
if (radioButton1.Checked == true)
{
this.IsMdiContainer = true;
f2.MdiParent = this;
f2.Show();
}
else
{
f2.Show();
}
f2.FormClosed += f2_FormClosed;
}
void f2_FormClosed(object sender, FormClosedEventArgs e)
{
this.IsMdiContainer = false;
f2 = null;
}
}
。
这是我的代码:
Form2
除非我将Form2
最大化为MDI子项然后将其关闭,否则一切都会正常工作。在该屏幕保持不变之后(因为我甚至没有关闭Form2
)但我可以打开新的Form1
,然后Form1 - [Form2]
的标题为“Form1 - [Form2] - [Form2]
“,如果我重复这个过程,那就是”f2_FormClosed
“等等。
我发现我的 void f2_FormClosed(object sender, FormClosedEventArgs e)
{
f2.Hide(); // <<<<<<<<-----------NEW
this.IsMdiContainer = false;
f2 = null;
}
方法应该是
Form2
但我不知道为什么; {{1}}应该关闭,我不知道为什么要隐藏它?!
谢谢!
答案 0 :(得分:0)
我同意Hans的观点,在运行时切换IsMdiContainer很不稳定,很可能会产生你还没见过的其他副作用。
认真考虑为您的应用设计不同的设计。
考虑到这一点,这可能是我整天发布的最愚蠢的黑客攻击:
public partial class Form1 : Form
{
Form2 f2;
System.Windows.Forms.Timer tmr = new System.Windows.Forms.Timer();
public Form1()
{
InitializeComponent();
tmr.Interval = 100;
tmr.Enabled = false;
tmr.Tick += delegate (object sender, EventArgs e) {
tmr.Stop();
this.IsMdiContainer = false;
};
}
private void button1_Click(object sender, EventArgs e)
{
if (f2 != null)
{
MessageBox.Show("Close form!");
return;
}
f2 = new Form2();
f2.FormClosed += delegate(object sender2, FormClosedEventArgs e2) {
f2 = null;
};
if (radioButton1.Checked == true)
{
this.IsMdiContainer = true;
f2.FormClosed += delegate(object sender3, FormClosedEventArgs e3) {
tmr.Start();
};
f2.MdiParent = this;
}
f2.Show();
}
}
*我最初尝试调用调用来更改IsMdiContainer,但这不起作用,所以我切换到了Timer。有效的愚蠢。谨慎使用此解决方案......