【问题标题】:C# update two text boxes at the same time?C#同时更新两个文本框?
【发布时间】:2016-04-27 14:00:35
【问题描述】:

假设我有两个文本框,一个保存二进制数据,另一个保存 ASCII 等价数据。如果用户说更改其中任何一个,我将如何同时更新另一个文本框,而无需按下按钮?

【问题讨论】:

  • 使用 textchanged 事件查看详情请查看此链接msdn.microsoft.com/en-us/library/…
  • 查看 textchange 事件,您需要小心,以确保您不会发现自己处于更改一个循环的循环中,因为另一个说它改变了,但它改变了,因为你改变了它
  • textchanged 在两个文本框中都会创建一个无限循环
  • 是的,我提到我们最好的方法是取消设置 onchange,具体取决于哪个有焦点
  • 当然——不小心使用 TextChanged 会造成循环。但是,由于在进行更改时直接调用 TextChanged,因此您可以设置一个标志(又名manualChange)以忽略更改。

标签: c# winforms user-interface


【解决方案1】:

你必须防止一个无限循环asciiTextBox改变binaryTextBox.Text改变asciiTextBox.Text等等),你可以实现类似的东西:

private void asciiTextBox_TextChanged(object sender, EventArgs e) {
  binaryTextBox.TextChanged -= binaryTextBox_TextChanged;

  try {
    binaryTextBox.Text = BinaryText(asciiTextBox.Text);
  }
  finally {
    binaryTextBox.TextChanged += binaryTextBox_TextChanged; 
  }
}

private void binaryTextBox_TextChanged(object sender, EventArgs e) {
  asciiTextBox.TextChanged -= asciiTextBox_TextChanged;

  try {
    asciiTextBox.Text = AsciiText(binaryTextBox.Text);
  }
  finally {
    asciiTextBox.TextChanged += asciiTextBox_TextChanged;
  }
}

【讨论】:

  • 非常详细的答案:)
  • 嗯,我想我明白了。我唯一不完全明白的是 binaryTextBox.TextChanged -= binaryTextBox_TextChanged;这条线发生了什么?抱歉,我是 OOP 新手:p
  • 当您使用两个TextBox 控件的TextChanged 事件来同步它们的文本时,没有无限循环。 Text 属性检查,如果新值与之前的值相同,则不会引发 TextChanged 事件。
  • @Rafas:我暂时 关闭 binaryTextBox'sTextChanged 事件同时更改 binaryTextBox.Text 然后将其切换回 on (让用户更改binaryTextBox)
【解决方案2】:

您当然不需要取消注册TextChanged 活动并重新注册!

当您使用两个TextBox 控件的TextChanged 事件来同步它们的文本时,没有无限循环。 Text 属性检查,如果新值与以前的值相同,则不会引发 TextChanged 事件。

所以你不需要删除处理程序。只需处理TextChanged 事件并更新其他控件。

在下面的示例中,我有 2 个TextBox 控件,您可以在两个控件中输入,反向字符串将显示在另一个控件上:

private void textBox1_TextChanged(object sender, EventArgs e)
{
    this.textBox2.Text = new string(this.textBox1.Text.Reverse().ToArray());
}

private void textBox2_TextChanged(object sender, EventArgs e)
{
    this.textBox1.Text = new string(this.textBox2.Text.Reverse().ToArray());
}

使用上述模式,您可以简单地使用 MakeBinaryMakeAscci 方法。你应该只有可逆的方法。

【讨论】:

    【解决方案3】:

    使用TextChanged Event查看link了解详情

    代码

    private void TextBox_TextChanged(object sender, EventArgs e)
    {
    // update your target text bx over here
    }
    

    只为一个盒子创建TextChanged Event,它会为两个盒子创建 创建无限循环

    【讨论】:

    • 当您使用两个TextBox 控件的TextChanged 事件来同步它们的文本时,没有无限循环。 Text 属性检查,如果新值与之前的值相同,则不会引发 TextChanged 事件。
    【解决方案4】:

    你应该使用TextChanged 事件。当用户在一个文本框中输入内容时,您会在 TextChanged 处理程序中处理它。

    为避免无限循环,您可以在开头取消订阅TextChange 事件并在处理程序结束时再次订阅:

    private void TextChangedHandler(object sender, EventArgs e)
    {
         textbox1.TextChanged -= TextChangedHandler;
         textbox2.TextChanged -= TextChangedHandler;
    
         // set textbox values
    
         textbox1.TextChanged += TextChangedHandler;
         textbox2.TextChanged += TextChangedHandler;
    
    }
    

    【讨论】:

    • textchanged 在两个文本框中将创建一个无限循环:我不是反对者
    • @Roma 当您使用两个TextBox 控件的TextChanged 事件来同步它们的文本时,没有无限循环。 Text 属性检查,如果新值与之前的值相同,则不会引发 TextChanged 事件。
    猜你喜欢
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 2018-11-08
    • 2012-08-29
    • 2011-07-27
    相关资源
    最近更新 更多