簡體   English   中英

在不觸發 TextChanged 事件的情況下更改文本框文本

[英]Changing Textbox text without firing TextChanged event

我在C#中的應用程序有一個帶有txt_TextChanged事件的Textbox

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

但是有一個特定的部分我想在不觸發txt_TextChanged事件的情況下更改txt.Text

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

我怎樣才能做到這一點?

沒有直接的方法可以防止針對text屬性引發事件,但是事件處理程序可以使用標志來確定天氣或不執行任務。 與附加和分離事件處理程序相比,這可能更有效。 這可以通過頁面中的變量甚至專門的類包裝器來完成

帶有變量:

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);
    }
}
txt.TextChanged -= textBox1_TextChanged;  // dettach the event handler
txt.Text = "something"; // update value
txt.TextChanged += textBox1_TextChanged; // reattach the event handler

試試這個擴展方法

  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事件。

您可以擴展文本框並在此處引入一個不會觸發TextChanged事件的新屬性。

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

一種快速而骯臟的方法是

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

然后在OnChange事件中,使用

if (ctrl.Enabled) {
  // offending code here.
}
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");
    }
}

我找到了一個簡單的方法,適用於不在同一個.cs文件中的事件處理程序和控件

public static void SetTextWithoutRaiseEvent(this TextBox textBox, string content)
{
    var scroll = textBox.Template.FindName("PART_ContentHost", textBox);
    (scroll as ScrollViewer).Content = content;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM