C# 为什么我的自定义事件触发两次?

C# 为什么我的自定义事件触发两次?,c#,winforms,events,C#,Winforms,Events,我搜索了相关的帖子,但没找到什么 我已经创建了一个用户控件。在我的用户控件中有一个文本框。我希望在我的用户控件中有一个事件,每当文本框TextChangedevent引发时触发该事件这是我到目前为止所做的:(这是用户控制代码) 这里是我使用用户控件的地方 public event EventHandler txtchnged; public void ontxtchnged() { txtchnged(this, EventArgs.Empty); }

我搜索了相关的帖子,但没找到什么

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

(这是用户控制代码)


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

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”将在控制台中打印两次,我真的不知道为什么以及如何修复它。

来自TextBox.TextChanged上的MSDN:

注意:此事件在创建TextBox控件并 最初用文本填充

这可能是你的问题,你得到了最初的事件

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


如果UserControl的InitializeComponent已经挂起事件,请检查其内部的代码。

您的代码看起来很好,因此您的文本框似乎更改了两次。请将断点放在
ontxtchned()行。然后检查调用堆栈以了解原因。如果你想得到一个完整的答案-张贴。对于
textBox1.Text的单个更改,提供的代码将输出一个
“hello”
。其他地方有错误(如果有)。可能右键单击myUserControl1\u txtchnged并选择查找“查找所有引用”。可能是另一个连接潜伏在某处。代码可能不干净,但这不是问题所在-这是阅读和维护代码以及回答此问题的问题。@hungndv您的答案是/是正确的。如果你不想取消删除它,因为它(我错了)已经被否决了,你可以发布一个新的(可能解释太短,人们不理解)。当然,我也可能错了……我认为@hungndv是对的,OP附加事件处理程序两次。请注意,TextBox在InitializeComponent()内初始化,即使在之后附加了处理程序也可见。它将在初始化过程中触发,但他的事件处理程序尚未连接。@AdrianoRepetti:我认为他错了。textbox的事件被激发并触发usercontrol。然后usercontrol触发ontxtchange。此事件由承载文本框的usercontrol的mainform接收并写入行。或者我这里有错误吗?我们没有他的完整源代码,但是:1)文本属性首先被分配2)TextChanged被激发,但没有事件处理程序,那么什么都不会发生(注意,myUserControl1_txtchned在InitializeComponents之后被附加)。3) 事件处理程序已附加。还要注意,设计器在对象初始化后附加事件处理程序然后1)首先分配文本属性,但什么也没有发生2)设计器生成的代码附加第一个事件处理程序3)操作代码再次附加相同的事件处理程序4)用户更改文本,事件生成一次,但被同一函数接收两次。它可能不是,但方法签名也是设计器生成的(带有私有修饰符)而不是编辑器在双击选项卡时生成的(当然,这不是证据,而是提示)。