我对多行TextBox(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");
}
}
如果您现在在TextBox中键入一个字符,则会触发该事件。正确的行为。
如果删除该字符,该事件将触发一次。正确的行为。
如果删除带有退格键的字符,则会触发一次该事件。正确的行为。
如果您通过选择并按Delete删除该字符,则该事件将触发一次。正确的行为。
然而
如果选择字符并键入另一个字符,则事件将在文本框清除后触发两次(在第一个事件触发时查看文本框),并在添加字符时触发一次。如果可以理解,这种行为是无稽之谈。
仅当设置了Multiline属性(我用于调整TextBox的大小)时才会发生这种情况。我花了5个小时才完成工作!
我的问题是我必须验证TextChanged事件中的每个字符,结果无效。
有没有人有任何想法?
我可以使用Keypress事件,但我需要做很多重新编码才能做到这一点。
答案 0 :(得分:0)
我的具体案例的解决方法更加奇怪。
我需要文本框具有特定大小,但除非是多行,否则无法更改高度。
然而,以下内容适用于我的小世界:
tb.Multiline = true;
tb.Size = new Size(x,y);
tb.Multiline = false;
this.Controls.Add(tb);
tb.TextChanged += new EventHandler(tb_TextChanged);
在http://en.code-bude.net/tag/c-textbox-height-resize/
找到解决方案不解决根本问题。