更改文本框文本而不触发TextChanged事件

问题描述:

我在 C#中的应用程序有一个文本框和一个 txt_TextChanged 事件。

My application in C# has a Textbox with a txt_TextChanged event.

private void txt_TextChanged(object sender, EventArgs e)
{
  //Do somthin
}

但是我要更改 txt.Text有一个特定的部分而不触发 txt_TextChanged 事件。

But there's one specific part that I want to change txt.Text without firing the txt_TextChanged event.

txt.Text ="somthing" //Don't fire txt_TextChanged

我该怎么做?

没有直接的方法来防止引发text属性的事件,但是事件处理程序可以使用标志来确定天气或不执行任务。与附加和分离事件处理程序相比,这可能更有效。这可以通过页面中的变量甚至是专门的类包装器来完成

There is no direct way to prevent the raising of events for the text property, however your event handler can use a flag to determine weather or not to perform a task. This i likely to be more efficient than attaching and detaching the event handler. This can be done by a variable within the page or even a specialized class wrapper

使用变量:

skipTextChange = true;
txt.Text = "Something";

protected void TextChangedHandler(object sender, EventArgs e) {
  if(skipTextChange){ return; }
  /// do some stuffl
}

使用专门的事件处理程序包装器

With specialized event handler wrapper

   var eventProxy = new ConditionalEventHandler<EventArgs>(TextBox1_TextChanged);
    TextBox1.TextChanged = eventProxy.EventAction;

    eventProxy.RaiseEvents = false;
    TextBox1.Text = "test";


    public void TextBox1_TextChanged(object sender, EventArgs e) {
       // some cool stuff;
    }

    internal class ConditionalEventHadler<TEventArgs> where TEventArgs : EventArgs
{
   private Action<object,TEventArgs> handler;

    public bool RaiseEvents {get; set;}

    public ConditionalEventHadler(Action<object, TEventArgs> handler)
    {
        this.handler = handler; 
    }

    public void EventHanlder(object sender, TEventArgs e) {
      if(!RaiseEvents) { return;}
      this.handler(sender, e);
    }
}