检测是否未以编程方式触发TextChanged事件

时间:2018-06-26 08:23:50

标签: winforms

我有一个TextChanged事件附加到Windows窗体中的TextBox。如何确定某个事件的特定调用是否不是通过程序触发而是通过用户与TextBox交互来触发的?

3 个答案:

答案 0 :(得分:0)

我不确定您的问题是什么意思。我将回答答案。

  1. 如果要以编程方式调用更改后的文本,并且由于用户交互性或以编程方式调用而有所不同:

    假设您以编程方式调用该函数时,在sender和event args上传递了null

    txt_TextChanged(null,null);
    ,则可以使用以下解决方案:

    private void txt_TextChanged(object sender, EventArgs e)
    {
        if(sender == null)
        {
            // triggered programmatically
        }
        else
        {
           // triggered by the user. sender object is the textbox interacted by the user
        } 
    }
    
  2. 如果要通过编程方式更改文本而不触发事件:

    this.txt.TextChanged -= new System.EventHandler(this.txt_TextChanged);
    txt.Text = "bar";
    this.txt.TextChanged += new System.EventHandler(this.txt_TextChanged);
    

答案 1 :(得分:0)

这是一个常见问题。您可以在更新值之前在表单上设置一个标志,然后在事件处理程序中对其进行检查:

handleEvent = false;
TextBox1.Text = "foo";
handleEvent = true;

然后在您的处理程序中,检查标志:

private void TextBox1_TextChanged(object sender, EventArgs e)
{
    if(handleEvent)
    {
        // do stuff
    }
}

答案 2 :(得分:0)

我想稍微扩展@rw_的解决方案。在您的TextBox事件处理程序中,

private void txt_TextChanged(object sender, EventArgs e)
{
             if (!(sender is null) &&((TextBox)sender).ContainsFocus)
                {
                    //Code if triggered by Click event
                }
                else
                {
                    //Code if triggered programmatically
                }
}

这将帮助您的程序适应由于某些原因sender对象不为null的情况。