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

时间:2012-03-09 15:38:44

标签: c# .net vb.net winforms

  

有没有办法找出是否因为

而触发了“TextChanged”事件      
      
  1. 用户正在输入文本框或
  2.   
  3. 程序员调用myTextBox.Text =“something”?
  4.   

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

4 个答案:

答案 0 :(得分:8)

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

public override String Text{
   get{return text;}
   set
   {
      //perform validation/formatting
      this.text = formattedValue;
   }

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

答案 1 :(得分:6)

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

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

在您的源代码中,为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;
    }
}

答案 2 :(得分:-2)

如果您想要执行验证,请使用Validating事件,而不是Validated(当行动为时已到时)。

那就说,真正的需要什么?

  

Validating事件提供了一个CancelEventArgs类型的对象。如果   你确定控件的数据无效,你可以取消   通过将此对象的Cancel属性设置为true来验证事件。如果   如果没有设置Cancel属性,Windows Forms将假定这一点   该控件的验证成功,并引发Validated事件。

(http://msdn.microsoft.com/en-us/library/ms229603.aspx)

答案 3 :(得分:-3)

// This is the manual way, which is an alternative to the first way.
// Type 'this.TextChanged += ' into your form's constructor.
// Then press TAB twice, and you will have a new event handler.
this.TextChanged += new EventHandler(textBox1_TextChanged);

void textBox1_TextChanged(object sender, EventArgs e)
{
    //put the logic here for your validation/requirements for validation
    // ex.  if (textbox1.Text=="something") {//don't validate}
    //
}