Changing Textbox text without firing TextChanged e

2019-01-27 16:13发布

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

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

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

How can I do that?

标签: c# textbox
6条回答
Anthone
2楼-- · 2019-01-27 16:45
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        EventHandler TextChanged_EventHandler = new EventHandler(textBox1_TextChanged);
        textBox1.TextChanged -= TextChanged_EventHandler;
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        MessageBox.Show("BUG");
    }
}
查看更多
欢心
3楼-- · 2019-01-27 16:56
txt.TextChanged -= textBox1_TextChanged;  // dettach the event handler
txt.Text = "something"; // update value
txt.TextChanged += textBox1_TextChanged; // reattach the event handler
查看更多
该账号已被封号
4楼-- · 2019-01-27 17:00

You can extend text box and introduce there a new property that will not trigger the TextChanged event.

    class SilentTextBox : TextBox
    {
        // if true, than the TextChanged event should not be thrown
        private bool Silent { get; set; }

        public string SilentText
        {
            set
            {
                Silent = true;
                Text = value;
                Silent = false;
            }
        }

        protected override void OnTextChanged(EventArgs e)
        {
            // raise event only if the control is in non-silent state
            if (!Silent)
            {
                base.OnTextChanged(e);
            }
        }
    }
查看更多
Deceive 欺骗
5楼-- · 2019-01-27 17:02

try this extension method

  public static class TextBoxExt
{
    private static readonly FieldInfo _field;
    private static readonly PropertyInfo _prop;

    static TextBoxExt()
    {
        Type type = typeof(Control);
        _field = type.GetField("text", BindingFlags.Instance | BindingFlags.NonPublic);
        _prop = type.GetProperty("WindowText", BindingFlags.Instance | BindingFlags.NonPublic);
    }

    public static void SetText(this TextBox box, string text)
    {
        _field.SetValue(box, text);
        _prop.SetValue(box, text, null);
    }
}

you can use textbox.SetText("...") to change text and the TextChanged event will not be fired.

查看更多
女痞
6楼-- · 2019-01-27 17:05

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

With a variable:

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);
    }
}
查看更多
Rolldiameter
7楼-- · 2019-01-27 17:11

A quick and dirty way is to do an

ctrl.Enable = false; 
ctrl.Text = "Something";
ctrl.Enable = true;

and then in the OnChange event, encapsulate the offending code with a

if (ctrl.Enabled) {
  // offending code here.
}
查看更多
登录 后发表回答