【问题标题】:WinForms: two way TextBox problemWinForms:双向TextBox问题
【发布时间】:2009-04-13 16:23:48
【问题描述】:

我有一个文本框,用于数据输入和显示。用户可以从列表中选择项目,每个项目都有一个相应的文本,当项目被选中时,文本框中会显示该文本。

用户可以编辑这个文本框,从而改变列表项的对应文本。

我的问题是:我使用 TextChanged 事件来检测用户何时输入一些文本并更新事件处理程序中的内部变量,但是当我以编程方式更改文本框的值时也会调用此事件处理程序。我希望仅在用户更改文本框时调用此处理程序。我怎样才能做到这一点?

编辑:组合框也有同样的问题。

【问题讨论】:

    标签: c# winforms textbox


    【解决方案1】:

    处理程序将始终被调用 - 我知道没有办法禁用它。但是,您可以简单地在您的类中设置一个标志来指示您已经以编程方式更改了状态并且应该忽略下一个事件。

    _updating = true;
    _textBox.Text = "New Text";  
    
    ...      
    
    _textBox_TextChanged( object sender, EventArgs e )
    {
        if( _updating ) { _updating = false; return; }
        // Do something special with the new text.
    }
    

    您也可以尝试创建您的文本框控件并覆盖 Text 属性以提供您自己的自定义逻辑。

    class MyTextBox : TextBox
    {
        public overrides string Text{ 
            get{ return base.Text; }
            set{
                if( value == Text ) return;
                _updating = true;
                base.Text = value;
                _updating = false;
               }
        }
    }
    

    【讨论】:

    • 我已经尝试过了,但这是有问题的,因为当新列表项包含相同的文本值时,不会调用 TextChanged,而下一次应该调用 TextChanged 时不会调用它。
    • 在这种情况下,您需要创建一个用于设置状态的 UpdateText 方法,而不是直接将其分配给 Text 属性。该方法可以检查我是否是相同的值并丢弃它。
    【解决方案2】:

    每当 TextBox 更改其 Text 属性时都会调用 TextChanged 事件,这可以通过修改 Text 属性来实现,或者当用户直接更改文本时,还有其他事件更可能适用于您正在尝试的场景去实现。

    • KeyPress:每当用户按下按键时触发
    • KeyDown:每当下拉键时触发
    • KeyUp:在拉起(释放)键时触发

    希望对你有帮助

    【讨论】:

    • 这是有问题的解决方案。当用户通过右键单击粘贴某些文本时,粘贴,则不会触发 Key* 事件处理程序。
    • 众所周知,我会使用 Validating 或 Leave 来处理这类事情
    【解决方案3】:

    您可以在程序更新中设置一个标志,如果设置了该标志,则可以在事件处理程序中提前退出。

    但是如果你使用数据绑定,那么变量和gui会自动同步,这样就避免了这个问题。

    【讨论】:

      【解决方案4】:

      您的意思是您希望第二个文本框显示取决于第一个文本框中的内容的内容,但前提是用户确实设置了它?

      您能否更具体地说明您想要实现的目标?在我看来,您的 UI 设计可能会让用户感到困惑,因为 B 中的文本有时与 A 相关,有时与 A 无关。

      如果您仍想这样做,典型的方法是使用更新标志,如其他答案中所建议的那样。

      【讨论】:

        【解决方案5】:

        检查文本框的焦点。如果它没有焦点,则表示用户没有对其进行编辑。

        【讨论】:

        • 但是如果它确实有焦点,并不意味着代码没有编辑它。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多