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



我有一个附加到 Windows 窗体中的文本框的TextChanged事件。如何确保对该事件的特定调用是否不是以编程方式触发的,而是由用户与 TextBox 交互触发的?

我想稍微扩展一下@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 的情况。

我不确定你的问题是什么意思。我会分开我的答案。

  1. 如果要以编程方式调用 text changed 函数,并且当用户交互性调用它或以编程方式调用它时有所不同:

    假设以编程方式调用函数时,在发送方和事件参数

    txt_TextChanged(null,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);
    

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

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

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

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

最新更新