Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在不触发TextChanged事件的情况下更改Textbox文本_C#_Textbox - Fatal编程技术网

C# 在不触发TextChanged事件的情况下更改Textbox文本

C# 在不触发TextChanged事件的情况下更改Textbox文本,c#,textbox,C#,Textbox,我在C#中的应用程序有一个Textbox,带有txt\u TextChanged事件 private void txt_TextChanged(object sender, EventArgs e) { //Do somthin } 但是有一个特定的部分我想在不触发txt\TextChanged事件的情况下更改txt.Text txt.Text ="somthing" //Don't fire txt_TextChanged 如何才能做到这一点?没有直接的方法来阻止文本属性引发事件,但是

我在
C#
中的应用程序有一个
Textbox
,带有
txt\u TextChanged
事件

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
使用一个变量:

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);
    }
}
var eventProxy=new ConditionalEventHandler(TextBox1\u TextChanged);
TextBox1.TextChanged=eventProxy.EventAction;
eventProxy.RaiseEvents=false;
TextBox1.Text=“测试”;
public void TextBox1\u TextChanged(对象发送方,事件参数e){
//一些很酷的东西;
}
内部类ConditionalEventHandler,其中TEventArgs:EventArgs
{
私人行动处理人;
公共bool RaiseEvents{get;set;}
public ConditionalEventHadler(操作处理程序)
{
this.handler=handler;
}
public void eventhandler(对象发送方,TEventArgs e){
如果(!RaiseEvents){return;}
此.handler(发送方,e);
}
}
尝试此扩展方法
您可以使用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.
}

TextBoxBase.OnTextChanged
方法触发TextChanged事件。创建自定义TextBox控件,重写OnTextChanged方法,并控制何时应触发事件以及何时不触发事件。如果Balanikas的答案不适合你,那么你可以尝试这种方法。你必须使用asp.net吗?使用jquery怎么样?@NiMa这不是winform应用程序web@AlexJolig抱歉,我的问题为什么不使用suspendlayout()和resumelayout()?您将从控件中删除事件。。。(通过给他注册
EventHandler
)我选择了第一部分。不需要其他了。过了一段时间,我意识到这是最简单的方法。对于Powershell,它的工作原理类似:
$txt.remove\u TextChanged($textBox1\u TextChanged)…
这是真实而简单的答案。
ctrl.Enable = false; 
ctrl.Text = "Something";
ctrl.Enable = true;
if (ctrl.Enabled) {
  // offending code here.
}