【发布时间】:2013-12-25 11:06:20
【问题描述】:
场景:
我有一个表单 (Form1),其中包含以下元素。
一个名为panel1的面板,四个按钮分别为btnLoadForm2、btnLoadForm3、btnSave、btnDelete。
当我单击btnLoadForm2 或btnLoadForm3 时,它会将Form2 或Form3 加载到panel1 中的Form1。
但问题是
例如;
当我使用第一个加载的表单时,无论在面板中加载哪个表单(Form2 或 Form3),btnSave 和 btnDelete 事件都在工作。但是当我切换表单时,按钮事件都在起作用。
代码:
// Codes in Form1 which consists of panel1 and all other buttons
private void btnloadForm2_Click(object sender, EventArgs e)
{
var form = panel1.Controls.OfType<Form>().First();
if (form.Name != "Form2")
{
panel1.Controls.Clear();
Form newForm = new Form2();
newForm.TopLevel = false;
newForm.Visible = true;
panel1.Controls.Add(newForm);
}
}
private void btnloadForm3_Click(object sender, EventArgs e)
{
var form = panel1.Controls.OfType<Form>().First();
if (form.Name != "Form3")
{
panel1.Controls.Clear();
Form newForm = new Form3();
newForm.TopLevel = false;
newForm.Visible = true;
panel1.Controls.Add(newForm);
}
}
private void btnSave_Click(object sender, EventArgs e)
{
var form = panel1.Controls.OfType<Form>().First();
if (form.Name == "Form2")
{
Form2 f2 = (Form2)Application.OpenForms.OfType<Form2>().FirstOrDefault();
f2.Save();
}
else if (form.Name == "Form2")
{
Form3 f3 = (Form3)Application.OpenForms.OfType<Form3>().FirstOrDefault();
f3.Save();
}
}
private void btnDelete_Click(object sender, EventArgs e)
{
var form = panel1.Controls.OfType<Form>().First();
if (form.Name == "Form2")
{
Form2 f2 = (Form2)Application.OpenForms.OfType<Form2>().FirstOrDefault();
f2.Delete();
}
else if (form.Name == "Form3")
{
Form3 f3 = (Form3)Application.OpenForms.OfType<Form3>().FirstOrDefault();
f3.Delete();
}
}
请任何人告诉我我的代码有什么问题..
我不打算在Form2 和Form3 中编写代码。在我第一次尝试将表单加载到Form1.Panel1 时,所有代码都可以正常工作。
【问题讨论】:
-
将一个form 放在另一个form 中通常是一个奇怪的想法。我建议只使用面板而不是表单 - 表单通常是顶级窗口。
-
使用 Controls.Clear() 是一个错误。这只会从面板中删除表单,不会处理它。因此,当您下次使用 Application.OpenForms 属性时,您会找到这些旧对象。您必须使用 Dispose() 来完全销毁表单对象。并且不要使用 OpenForms,没有意义。