我有一个带有两个按钮的MdiParent,当button1单击时,form1将显示,当button2单击时,form2将显示,然后form1将隐藏,反之亦然。例如,我单击了form1打开的button1,然后输入form1的textBox。之后,我点击button2然后form2显示和form1隐藏。问题是当我再次单击form1显示的button1时,但缺少textBox中的先前类型。似乎表单没有隐藏,但是当单击按钮时关闭然后再次打开。
public static class Extensions
{
public static void openForm<T>(this T frm, Form parent) where T : Form, new()
{
foreach (Form childForm in parent.MdiChildren)
{
childForm.Visible = false;
}
foreach (Form form in Application.OpenForms)
{
if (form.GetType() == typeof(T))
{
form.Visible = true;
return;
}
}
frm = new T();
frm.MdiParent = parent;
frm.WindowState = FormWindowState.Normal;
frm.StartPosition = FormStartPosition.CenterScreen;
frm.MaximizeBox = false;
frm.MinimizeBox = false;
frm.Show();
}
}
这就是我打开子窗体的方式:
修改
public partial class MainForm : Form
{
form1 newform1 = new form1();
form2 newform2 = new form2();
private void Button1_Click(object sender, EventArgs e)
{
newform1.openForm(this);
}
private void Button2_Click(object sender, EventArgs e)
{
newform2.openForm(this);
}
}
答案 0 :(得分:2)
MDI实际上并不支持隐藏子窗口。 Winforms有一个解决方法,当你将Visible属性设置为false(或调用Hide())时,它将销毁本机窗口,并且当你创建它时重新创建窗口再次可见。
不幸的是,你的案例中存在一个字节错误。销毁本机窗口也会使它从Application.OpenForms()集合中消失。您依赖该集合来查找窗口,它不会起作用,您将始终创建表单的 new 实例。当然,TextBox中没有任何文本。使用调试器btw很容易看到。
因此您无法使用OpenForms集合。但是,您可以使用MdiChildren集合来找回它。所以重写为:
bool found = false;
foreach (Form childForm in parent.MdiChildren) {
if (form.GetType() = typeof(T)) form.Visible = found = true;
else form.Visible = false;
}
if (!found) {
// etc...
}
答案 1 :(得分:0)
new form1().openForm(this);
new form2().openForm(this);
您正在创建表单的新实例,显示的表单不是隐藏的表单,这就是文本框中的文本丢失的原因。尽量不要创建新实例。
var someForm1 = new form1();
var someForm2 = new form2();
someForm1.openForm(this);
表格2的显然是
someForm2.openForm(this);
答案 2 :(得分:0)
尝试使用form.hide();
隐藏表单,使用form.show();
再次显示表单。