在不触发 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
我该怎么做?
txt.TextChanged -= textBox1_TextChanged; // dettach the event handler
txt.Text = "something"; // update value
txt.TextChanged += textBox1_TextChanged; // reattach the event handler
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");
}
}
没有直接的方法来阻止引发文本事件 属性,但是您的事件处理程序可以使用标志来确定天气或不执行任务。这可能比附加和分离事件处理程序更有效。这可以通过页面内的变量甚至专门的 class 包装器
来完成
有一个变量:
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);
}
}
试试这个扩展方法
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
{
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);
}
}
}
一种快速而肮脏的方法是做一个
ctrl.Enable = false;
ctrl.Text = "Something";
ctrl.Enable = true;
然后在 OnChange 事件中,用
封装有问题的代码
if (ctrl.Enabled) {
// offending code here.
}
我在 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
我该怎么做?
txt.TextChanged -= textBox1_TextChanged; // dettach the event handler
txt.Text = "something"; // update value
txt.TextChanged += textBox1_TextChanged; // reattach the event handler
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");
}
}
没有直接的方法来阻止引发文本事件 属性,但是您的事件处理程序可以使用标志来确定天气或不执行任务。这可能比附加和分离事件处理程序更有效。这可以通过页面内的变量甚至专门的 class 包装器
来完成有一个变量:
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);
}
}
试试这个扩展方法
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
{
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);
}
}
}
一种快速而肮脏的方法是做一个
ctrl.Enable = false;
ctrl.Text = "Something";
ctrl.Enable = true;
然后在 OnChange 事件中,用
封装有问题的代码if (ctrl.Enabled) {
// offending code here.
}