Bli*_*ury 5 c# multiline winforms textchanged
我对多行文本框 (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");
}
}
Run Code Online (Sandbox Code Playgroud)
如果您现在在 TextBox 中键入一个字符,则会触发该事件。正确的行为。
如果您删除该角色,该事件将触发一次。正确的行为。
如果您使用退格键删除字符,则事件会触发一次。正确的行为。
如果您通过选择该字符并按 Delete 键来删除该字符,则该事件将触发一次。正确的行为。
然而
如果您选择该字符并键入另一个字符,则该事件会触发两次,一次是在文本框被清除后(在第一个事件触发时查看文本框),另一次是在添加该字符时。如果可以理解,这种行为是无稽之谈。
这仅在设置 Multiline 属性时发生(我使用它来调整 TextBox 的大小)。我只用了 5 个小时就搞定了!
我的问题是我必须验证 TextChanged 事件中的每个字符,但得到的结果无效。
有没有人有任何想法?
我可能会使用 Keypress 事件,但我需要做很多重新编码才能做到这一点。
我的特殊情况的解决方法更加奇怪。
我需要文本框具有特定的大小,但高度不能更改,除非它是多行的。
然而,以下内容在我的小世界中对我有用:
tb.Multiline = true;
tb.Size = new Size(x,y);
tb.Multiline = false;
this.Controls.Add(tb);
tb.TextChanged += new EventHandler(tb_TextChanged);
Run Code Online (Sandbox Code Playgroud)
解决方案位于http://en.code-bude.net/tag/c-textbox-height-resize/
但并不能解决根本问题。
归档时间: |
|
查看次数: |
1300 次 |
最近记录: |