Я предполагаю, что вы создаете 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;
}
}
}
В своем источнике добавьте один и тот же обработчик к событиям 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;
}
}