有没有办法找出是否因为
而触发了“TextChanged”事件
- 用户正在输入文本框或
- 程序员调用myTextBox.Text =“something”?
醇>
为了给你一些颜色,当用户在文本框中键入每个字母时我不想做出反应,因此我使用“Validated”事件来捕获用户完成后我可以做出反应。问题是,当程序员执行“myTextbox.Text =”某事时,我没办法抓住。我知道捕获更改的唯一方法是使用TextChanged,但后来我不想做出反应用户在文本框中键入每个字母。有任何建议吗?
答案 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}
//
}