我在WinForms的多行文本框中遇到了一个非常奇怪的TextChanged事件问题。在某些情况下,该事件会触发两次。
以下完整代码展示了这个问题:
public partial class TextChangedTest : Form
{
public TextChangedTest()
{
InitializeComponent();
}
private void TextChangedTest_Load(object sender, EventArgs e)
{
TextBox tb = new TextBox();
//Remove the following line and the code behaves as expected
tb.Multiline = true;
this.Controls.Add(tb);
tb.TextChanged += new EventHandler(tb_TextChanged);
}
private void tb_TextChanged(object sender,EventArgs e)
{
//Need to validate and use the new text here.
//For testing, just use a MessageBox
MessageBox.Show("Handler fired");
}
}
如果您现在在文本框中输入字符,事件会触发。这是正确的行为。
如果您删除字符,事件会被触发一次。这是正确的行为。
如果您使用退格键删除字符,事件会被触发一次。这是正确的行为。
如果您选择字符并按Delete键删除该字符,事件会被触发一次。这是正确的行为。
然而
如果您选中一个字符并输入另一个字符,事件会被触发两次:第一次在文本框清空后触发(当第一个事件触发时,请查看文本框),第二次在添加字符时触发。这种行为是无意义的,但可以理解。
只有在设置了多行属性(我正在使用它来调整文本框大小)才会出现这种情况。我花了5个小时才弄清楚!
我的问题是,我必须在TextChanged事件中验证每个字符,但我得到了无效的结果。
有人有什么想法吗?
我可能可以使用Keypress事件,但我需要进行大量的重新编码才能做到这一点。