c# Textchanged 事件在多行文本框中触发两次

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 事件,但我需要做很多重新编码才能做到这一点。

Bli*_*ury 1

我的特殊情况的解决方法更加奇怪。

我需要文本框具有特定的大小,但高度不能更改,除非它是多行的。

然而,以下内容在我的小世界中对我有用:

    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/

但并不能解决根本问题。