【问题标题】:How do I restrict events firing more than once at a time如何限制一次触发多次的事件
【发布时间】:2014-12-15 12:47:13
【问题描述】:

由于我在发布图片方面没有太多声誉,因此我将其作为一个大问题进行详细说明。

我有三个窗口窗体,其中每次创建窗体时事件的执行都会增加。

1. Form1(主窗体)

这里我称之为包含用户控件的第二个表单(SubForm)。

2。 Form2(子表单)

这里我通过点击用户控件调用第二个表单(ChildForm)。

3. Form3(子窗体)

它包含一个确定按钮。

这是我的问题。

  • 首先我打开 MainForm 并单击按钮打开第二个表单(SubForm)。
  • 现在在第二个表单(子表单)中,我单击显示第三个表单(子表单)的用户控件。
  • 当我在第三个表单中单击“确定”按钮时,该表单将关闭。
  • 现在我关闭第二个表单(子表单)而不关闭第一个表单(主表单),然后单击第一个表单(主表单)中的按钮再次打开第二个表单(子表单)。
  • 现在我点击第二个表单(SubForm)中的用户控件,打开第三个表单(ChildForm)。
  • 现在,当我在第三个表单(ChildForm) 中单击“确定”时,第二个表单(SubForm) 中的事件再次被触发,第三个表单(ChildForm) 被打开四次。
  • 现在,当我再次关闭第二个表单(子表单)并单击用户控件并获取第三个表单(ChildForm)时,第三个表单(ChildForm)会打开三次等等。

这是第一种形式的代码(MainForm)

private void button1_Click(object sender, EventArgs e)
{
    SubForm obj = new SubForm ();     
    obj.ShowDialog();
} 

这是包含用户控件的第二种形式(SubForm)的代码

// Event generation
UserControl1.MouseUp += new EventHandler(this.Node_Click); 

// Event that calls the ChildForm 
private void Node_Click(object sender, EventArgs e)
{
       ChildForm obj = new ChildForm();     
       obj.ShowDialog();                
}

这是第一种形式的代码(MainForm)

private void btnOK_Click(object sender, EventArgs e)
{
   this.Close();
} 

有人知道为什么会这样吗?

【问题讨论】:

  • MouseUp 事件分配发生在哪里?
  • 你在哪里订阅UserControl1.MouseUp += new EventHandler(this.Node_Click);?如果您多次订阅,事件将被触发多次。

标签: c# .net events delegates


【解决方案1】:

嘿,我不确定发生了什么,但如果您希望 node_click 仅应用一次,只需声明一个 bool var canEnter=true; 并做到这一点

    private void Node_Click(object sender, EventArgs e) { 
    if(canEnter) {
           ChildForm obj = new ChildForm();     
           obj.ShowDialog();    
canEnter=false;
 } 
             }

并为子表单(关闭事件)制作事件并将其放置在其中 可以输入=真; 如果我猜对了,我想这就是你需要做的:)

【讨论】:

    【解决方案2】:

    既然你打电话给UserControl1.MouseUp,我想你已经将事件声明为static。因此,即使您关闭了第二个表单(保持第一个表单未关闭),该事件也不会被清除。为此,您需要Unsubscribe 活动。

    使用第二种形式的Form_Closing事件来Unsubscribe事件。

    private void SubForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        UserControl1.MouseUp -= new EventHandler(this.Node_Click);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多