控制事件在我预期的表单之外的其他表单上触发 C#

Control events trigger on other forms than my intended formC#

我有一个关于在 C# 中创建新表单的问题。 我想创建多个表单(MainPanel),如下面的代码所示。这将创建一个新表单并显示它。

        private void Panel_MouseClick(object sender, MouseEventArgs e)
        {
            Form mp = new MainPanel();
            mp.Show();
        }

在 MainPanel 窗体中,我设置了一些事件和控件。其中之一是退出按钮,如果您按下它,它会关闭表单

    public partial class MainPanel : Form
    {
        private static MainPanel mainPanel;
        public MainPanel()
        {
            InitializeComponent();
            mainPanel = this;

            Panel panel = new Panel();
            panel.Name = "ExitButton";
            panel.BackColor = ExitButtonColor;
            panel.BorderStyle = BorderStyle.None;
            panel.BackColor = Color.Transparent;
            panel.Width = 30;
            panel.Height = 30;

            panel.MouseClick += PanelExit_MouseClick;
            this.Controls.Add(panel);
        }

        private static void PanelExit_MouseClick(object sender, MouseEventArgs e)
        {
            mainPanel.Close();
        }
}

当我调用 Form mp = new MainPanel();.Show() 时,它会按预期运行并打开。退出按钮也有效。 然而,当我通过创建一个新的 new MainPanel(); 然后 .Show(); 打开第二个时。那么退出按钮就真的不起作用了。

这意味着我有 2 个打开的 MainPanel 窗体,它们都有自己的退出按钮。如果我点击第一个表单退出按钮,点击它将关闭第二个表单。 单击第二个窗体上的退出按钮也将关闭第二个窗体。换句话说,我的第一个表单上的所有事件都在我的第二个表单上被触发和执行。

知道为什么会发生这种情况或如何避免这种情况吗?

It is not obvious why you used static, but that's what happens when you do. As-is, you must not allow a second instance to be created

正如 Hans 在我的 post 下评论的那样,我将所有变量和方法保持为静态,对所有创建的表单保持相同。从方法和变量中删除静态就完成了工作。

谢谢

旁注,您根本不需要“mainPanel”。为什么要存储对 this 的引用?直接用就好了...

变化:

private static void PanelExit_MouseClick(object sender, MouseEventArgs e)
{
    mainPanel.Close();
}

收件人:

private void PanelExit_MouseClick(object sender, MouseEventArgs e)
{
    this.Close();
}

也从方法签名中删除静态。