【问题标题】:Changing Textbox text without firing TextChanged event在不触发 TextChanged 事件的情况下更改文本框文本
【发布时间】:2015-01-04 06:38:57
【问题描述】:

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

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

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

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

我该怎么做?

【问题讨论】:

  • TextBoxBase.OnTextChanged 方法触发 TextChanged 事件。创建一个自定义 TextBox 控件,重写 OnTextChanged 方法并控制何时应该触发事件以及何时不触发。如果 Balanikas 的答案不适合您,那么您可以尝试这种方法。
  • 你必须使用 asp.net 吗?使用 jquery 怎么样?
  • @NiMa 这是winform应用程序而不是web
  • @AlexJolig 对不起,我的错
  • 为什么不用suspendlayout()和resumelayout()?

标签: c# textbox


【解决方案1】:

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

带变量:

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

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

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

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

【讨论】:

  • 我选择了第一部分。其余的都不需要。
【解决方案2】:
txt.TextChanged -= textBox1_TextChanged;  // dettach the event handler
txt.Text = "something"; // update value
txt.TextChanged += textBox1_TextChanged; // reattach the event handler

【讨论】:

  • 过了一会儿,我意识到这是最简单的方法。
  • 对于 Powershell,这同样适用:$txt.remove_TextChanged($textBox1_TextChanged)...
  • 这才是真实而简单的答案。
【解决方案3】:

试试这个扩展方法

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

您可以使用 textbox.SetText("...") 更改文本,并且不会触发 TextChanged 事件。

【讨论】:

    【解决方案4】:

    您可以扩展文本框并在那里引入一个不会触发 TextChanged 事件的新属性。

        class SilentTextBox : TextBox
        {
            // if true, than the TextChanged event should not be thrown
            private bool Silent { get; set; }
    
            public string SilentText
            {
                set
                {
                    try 
                    {
                        Silent = true;
                        Text = value;
                    } 
                    finally 
                    {
                        Silent = false;
                    }
                }
            }
    
            protected override void OnTextChanged(EventArgs e)
            {
                // raise event only if the control is in non-silent state
                if (!Silent)
                {
                    base.OnTextChanged(e);
                }
            }
        }
    

    【讨论】:

      【解决方案5】:

      一个快速而肮脏的方法是做一个

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

      然后在 OnChange 事件中,用 a 封装有问题的代码

      if (ctrl.Enabled) {
        // offending code here.
      }
      

      【讨论】:

        【解决方案6】:
        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");
            }
        }
        

        【讨论】:

        • 你从控件中删除事件...(通过EventHandler注册他)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-03
        • 2019-12-28
        相关资源
        最近更新 更多