文本更改了textBox对象的事件:如何执行文本更改+另一个操作

时间:2014-10-28 21:30:17

标签: c# winforms

我希望当用户输入/更改textBox1的文本时,同时第二个textBox2的文本将被清除。为此,我只是在表单中添加了一个事件:

private void textBox1_TextChanged(object sender, EventArgs e)
    {
        this.textBox2.Text = "";
    }

但是,这会导致textBox2被清除,但用户输入的输入会丢失。实际上:

我的期望: 如果textBox1文本为空且textBox2不是,则当用户键入" A"在第一个文本框中,我会同时清除textBox2字母和#34; A"进入textBox1

我得到了什么: textBox2变得清晰,但是字母" A"没有出现在textBox1中:我必须再次输入它才能将其输入到正确的位置。

在清除textBox1时,我应该怎样做才能将用户输入textBox2

编辑:实际上忘记添加代码的重要部分,即" twin"上面发布的方法的兄弟:

private void textBox2_TextChanged(object sender, EventArgs e)
    {
        this.textBox1.Text = "";
    }

我稍微修改了一下我的问题:如何避免将textBox2中的清算视为text_changed事件,从而达到预期的行为?

5 个答案:

答案 0 :(得分:2)

您可以禁用事件处理程序,以避免一个事件干扰另一个事件 您也可以使用全局布尔变量,但我更喜欢这种方法,因为它不需要全局变量而不需要ifs

private void textBox1_TextChanged(object sender, EventArgs e)
{
    this.textBox2.TextChanged -= textBox2_TextChanged;
    this.textBox2.Text = "";
    this.textBox2.TextChanged += textBox2_TextChanged;
}

private void textBox2_TextChanged(object sender, EventArgs e)
{
    this.textBox1.TextChanged -= textBox1_TextChanged;
    this.textBox1.Text = "";
    this.textBox1.TextChanged += textBox1_TextChanged;
}

答案 1 :(得分:2)

我建议保持你的处理程序干净整洁,就像你拥有它们一样,而是做两件事之一:

  • 使用Modified属性检查用户是否实际修改了文本框。当对Text进行编程更改
  • 时,此bool会自动恢复为false
  • 改为绑定到键盘事件

使用Modified

以下是如何实施前一个选项:

public void TextBox1_TextChanged(object sender, EventArgs ea)
{
    if (textBox1.Modified) textBox2.Clear(); 
}

这对于任何查看代码的人来说都很漂亮且易于理解。如果Text属性已以编程方式更改(如在您的情况下,由另一个事件处理程序),则Modified属性为false,并且不会发生清除。

作为奖励,如果您在其他地方进行程序化更改并且执行希望事件处理程序能够完成,您可以轻松地明确设置Modified = true

textBox1.Text = @"I have been set programmatically, 
                  but in this specific case the other box 
                  should still be cleared";
textBox1.Modified = true;

使用键盘事件

以下是使用键盘事件实现此目的的方法:

private void TextBox1_TextChanged(object sender, EventArgs e)
{
    textBox2.Clear();
}

您正在为事件绑定执行事件处理程序:

textBox1.KeyDown += TextBox1_TextChanged;
textBox1.Paste += TextBox1_TextChanged;

其他改进

通过添加将文本框清除逻辑绑定到任何其他文本框的方法,可以使这更加通用。以下是我在测试winforms项目中使用它的方法:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        ClearOnUserInput(textBox1, textBox2);
        ClearOnUserInput(textBox2, textBox1);
    }

    private void ClearOnUserInput(TextBox inputBox, TextBox target)
    {
        inputBox.TextChanged += delegate {
            if(inputBox.Modified) target.Clear();
        };
    }
}

请注意,我添加了一个单独的方法来附加清除逻辑以保持DRY,我也在这里使用匿名委托来避免添加额外的方法。您可以像以前一样轻松使用两个处理程序。

答案 2 :(得分:1)

当您在textBox2 TextChanged事件中更改textBox1的文字时,它会触发TextChanged textBox2事件textBox1,而""事件会设置TextChanged 1}}文字到private void textBox1_TextChanged(object sender, EventArgs e) { this.textBox2.TextChanged -= textBox2_TextChanged; this.textBox2.Text = ""; this.textBox2.TextChanged += textBox2_TextChanged; } private void textBox2_TextChanged(object sender, EventArgs e) { this.textBox1.TextChanged -= textBox1_TextChanged; this.textBox1.Text = ""; this.textBox1.TextChanged += textBox1_TextChanged; }

要解决此问题,您可以在更改文本之前删除每个处理程序中相反的{{1}}处理程序,然后将其放回:

{{1}}

答案 3 :(得分:0)

如果您尝试仅允许一个文本框接受输入并始终清除另一个文本框,则可以跟踪代码是否在单独的变量中更改文本。

示例:

// This variable tracks whether or not our code is changing the text
// If it's set to false, then the user is changing the text
private bool ignoreTextChange = false;

private void textBox1_TextChanged(object sender, EventArgs e)
{
    if (ignoreTextChange)
    {
        // Our code is changing the text, so just reset the variable
        ignoreTextChange = false;
    }
    else
    {
        // Our code is going to change the other text box,
        // so set our variable and clear the other text box
        ignoreTextChange = true;
        this.textBox2.Text = "";   
    }        
}

private void textBox2_TextChanged(object sender, EventArgs e)
{
    if (ignoreTextChange)
    {
        ignoreTextChange = false;
    }
    else
    {
        ignoreTextChange = true;
        this.textBox1.Text = "";
    }  
}

答案 4 :(得分:0)

您正在使用Text Changed事件,因此请考虑在文本框中添加1个字符:

private void textBox1_TextChanged(object sender, EventArgs e)
{
    if (textBox1.Text.Length == 1 && textBox2.Text != String.Empty)
        textBox2.Text = String.Empty;
}

我建议您为您的方案使用Key Down事件。它会在更改文本框的Text之前触发,并且会在合适的时间检查您的条件。