【问题标题】:When I switch between forms some events are not working当我在表单之间切换时,某些事件不起作用
【发布时间】:2013-12-25 11:06:20
【问题描述】:

场景:

我有一个表单 (Form1),其中包含以下元素。

一个名为panel1的面板,四个按钮分别为btnLoadForm2btnLoadForm3btnSavebtnDelete

当我单击btnLoadForm2btnLoadForm3 时,它会将Form2Form3 加载到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();
        }
    }

请任何人告诉我我的代码有什么问题..

我不打算在Form2Form3 中编写代码。在我第一次尝试将表单加载到Form1.Panel1 时,所有代码都可以正常工作。

【问题讨论】:

  • 将一个form 放在另一个form 中通常是一个奇怪的想法。我建议只使用面板而不是表单 - 表单通常是顶级窗口。
  • 使用 Controls.Clear() 是一个错误。这只会从面板中删除表单,不会处理它。因此,当您下次使用 Application.OpenForms 属性时,您会找到这些旧对象。您必须使用 Dispose() 来完全销毁表单对象。并且不要使用 OpenForms,没有意义。

标签: c# winforms panel


【解决方案1】:

您应该显示表单,而不是将其作为控件添加到面板。

所以做类似的事情:

newForm.Show();

newForm.ShowDialog();

【讨论】:

    猜你喜欢
    • 2021-09-24
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多