如果用户在文本框中键入或者以编程方式调用myTextBox.Text,如何查找是否触发了"TextChanged"事件

Den*_*nis 8 .net c# vb.net winforms

有没有办法找出"TextChanged"事件是否被触发,因为

  1. 用户正在输入文本框或
  2. 程序员调用myTextBox.Text ="something"?

只是为了给你一些颜色,当用户在文本框中键入每个字母时我不想做出反应,因此我使用"Validated"事件来捕获用户完成后我可以做出反应.问题是,当程序员执行"myTextbox.Text ="某事时,我没办法抓住.我知道捕获更改的唯一方法是使用TextChanged,但后来我不想做出反应用户在文本框中键入每个字母.有任何建议吗?

jzw*_*man 8

所以在你的"格式化"文本框类中:

public override String Text{
   get{return text;}
   set
   {
      //perform validation/formatting
      this.text = formattedValue;
   }
Run Code Online (Sandbox Code Playgroud)

这应该允许您在程序员更改文本时格式化文本,仍然需要在验证事件中处理用户输入验证.


Jos*_*nig 6

我猜你正在创建其他开发人员将使用的UserControl,因此"最终用户"程序员可以以编程方式设置文本.我认为最简单的方法是遵循@jzworkman的建议并创建一个覆盖Text属性设置器的类.正如@vulkanino指出的那样,你应该提升并捕获Validating事件.

public class TextBoxPlus : TextBox {
    public event CancelEventHandler ProgrammerChangedText;
    protected void OnProgrammerChangedText(CancelEventArgs e) {
        CancelEventHandler handler = ProgrammerChangedText;
        if (handler != null) { handler(this, e); }
    }

    public override string Text {
        get {
            return base.Text;
        }
        set {
            string oldtext = base.Text;
            base.Text = value;
            CancelEventArgs e = new CancelEventArgs();
            OnProgrammerChangedText(e);
            if (e.Cancel) base.Text = oldtext;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在源代码中,为Validating和ProgrammerChangedText事件添加相同的处理程序:

// Somewhere...
textBoxPlus1.Validating += textBoxPlus1_Validating;
textBoxPlus1.ProgrammerChangedText += textBoxPlus1_Validating;

void textBoxPlus1_Validating(object sender, CancelEventArgs e) {
    decimal d;
    if (!Decimal.TryParse(textBoxPlus1.Text, out d)) {
        e.Cancel = true;
    }
}
Run Code Online (Sandbox Code Playgroud)