Den*_*nis 8 .net c# vb.net winforms
有没有办法找出"TextChanged"事件是否被触发,因为
- 用户正在输入文本框或
- 程序员调用myTextBox.Text ="something"?
只是为了给你一些颜色,当用户在文本框中键入每个字母时我不想做出反应,因此我使用"Validated"事件来捕获用户完成后我可以做出反应.问题是,当程序员执行"myTextbox.Text ="某事时,我没办法抓住.我知道捕获更改的唯一方法是使用TextChanged,但后来我不想做出反应用户在文本框中键入每个字母.有任何建议吗?
所以在你的"格式化"文本框类中:
public override String Text{
get{return text;}
set
{
//perform validation/formatting
this.text = formattedValue;
}
Run Code Online (Sandbox Code Playgroud)
这应该允许您在程序员更改文本时格式化文本,仍然需要在验证事件中处理用户输入验证.
我猜你正在创建其他开发人员将使用的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)