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

gkl3eglg  于 2023-06-24  发布在  其他
关注(0)|答案(2)|浏览(154)

我搜索了相关的帖子,但没有什么发现
我创建了一个用户控件。在我的用户控件中有一个文本框。我希望在用户控件中有一个事件,每当引发文本框TextChanged事件时,该事件就会触发。
这就是我到目前为止所做的:
(This是用户控件的代码)

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");
    }

这是可行的,我知道代码可能不干净,但这不是问题所在。问题是:“你好”将在控制台打印两次,我真的不知道为什么和如何修复它。

4jb9z9bj

4jb9z9bj1#

来自TextBox上的MSDN。TextChanged:
注意:此事件在TextBox控件创建并初始填充文本时激发。
这可能是你的问题,你得到的初始事件?
更新:
从Adriano Repetti提示评论:是否通过双击设计器获得了textBox1_TextChanged事件处理程序?
然后,您已经向TextChanged事件添加了第二个钩子。
检查UserControl的InitializeComponent内的代码是否已挂接事件。

vkc1a9a2

vkc1a9a22#

您可以在接受订阅之前执行检查。

private event EventHandler _txtchnged;
    public event EventHandler txtchnged{
     add{
      if(_txtchnged == null || !_txtchnged.GetInvocationList().Contains(value)){
        _txtchnged  += value;
      }
     }
     remove{
      _txtchnged  -= value;

     }
    }           

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

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

相关问题