【问题标题】:Why my custom event fires twice?为什么我的自定义事件会触发两次?
【发布时间】:2015-06-29 20:44:55
【问题描述】:

我已经搜索了相关帖子,但没有得到什么

我创建了一个用户控件。在我的用户控件中有一个文本框。我想在我的用户控件中有一个事件,每当文本框TextChanged 事件引发时就会触发。
这是我到目前为止所做的:

(这是用户控制的代码)

public event EventHandler txtchnged;

    public void ontxtchnged()
    {
        txtchnged(this, EventArgs.Empty);
    }

    public MyTextBox()
    {
        InitializeComponent();
        textBox1.TextChanged += textBox1_TextChanged;
    }
    private void textBox1_TextChanged(object sender, EventArgs e)
    {          
        ontxtchnged();  
    }


这是我使用用户控件的地方

    public RegisterMainFrm()
    {

        InitializeComponent();
        myUserControl1.txtchnged += myUserControl1_txtchnged;

    }

    private void myUserControl1_txtchnged(object sender, EventArgs e)
    {
        Console.WriteLine("hello");
    }

这行得通,我知道代码可能不干净,但这不是问题。问题是:“hello”将在控制台打印两次,我真的不知道为什么以及如何解决它。

【问题讨论】:

  • 您的代码看起来不错,因此看起来您的文本框正在更改两次。
  • 在ontxtchnged(); 行放置断点。然后检查调用堆栈以查看原因。如果您想获得完整的答案 - 发布MCVE。提供的代码将输出一个"hello",以对textBox1.Text 进行一次更改。其他地方的错误(如果有的话)。
  • 也许右键单击 myUserControl1_txtchnged 并选择查找“查找所有引用”。可能是潜伏在某处的另一个连接。
  • 代码可能不干净,但这不是问题 - 这是阅读和维护代码以及回答此问题的问题。
  • @hungndv I think 你的答案是正确的。如果您不想取消删除它,因为它(IMO 错误地)已经被否决了,您可以发布一个新的(可能解释太短而且人们不理解它)。好吧,当然我也可能错了……

标签: c# winforms events


【解决方案1】:

来自 MSDN 上的 TextBox.TextChanged:

注意:该事件在 TextBox 控件被创建并且 最初填充文本。

这可能是您获得初始事件的问题吗?

更新:
来自 Adriano Repetti 评论中的提示:您是否通过双击设计器获得了 textBox1_TextChanged 事件处理程序?
然后,您向 TextChanged 事件添加了第二个挂钩。

检查你的 UserControl 的 InitializeComponent 中的代码是否已经挂钩事件。

【讨论】:

  • 我认为@hungndv 是对的,OP 附加了两次事件处理程序。请注意,TextBox 在 InitializeComponent() 内部进行了初始化,并且可见的偶数处理程序附加在 之后。它将在初始化期间被触发,但他的事件处理程序尚未附加。
  • @AdrianoRepetti:我认为他错了。文本框的事件被触发并触发用户控件。然后用户控件触发 ontxtchanged。该事件由承载文本框的用户控件的主窗体接收并写入该行。还是我这里有错误?
  • 我们没有他的完整源代码,但是:1) 首先分配了 Text 属性 2) 触发了 TextChanged 但没有事件处理程序然后什么都不会发生(注意 myUserControl1_txtchnged 附加在 InitializeComponents 之后)。 3) 附加事件处理程序。另请注意,设计器在对象初始化后附加事件处理程序。
  • 但是,如果 InitializeComponent() 中附加了事件处理程序,则 1) 首先分配文本属性但没有任何反应 2) 设计器生成的代码附加第一个事件处理程序 3) OP 代码再次附加相同的事件处理程序 4 ) 用户更改文本和事件生成一次,但由同一函数接收两次。
  • 它可能不是,但是方法签名是设计器生成的(带有私有修饰符)而不是编辑器在您双击TAB时生成的(当然这不是证据而是提示)。
猜你喜欢
  • 2014-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多