控制事件在我预期的表单之外的其他表单上触发 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();
}
也从方法签名中删除静态。
我有一个关于在 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();
}
也从方法签名中删除静态。