我有一个TextBox,用于数据输入和显示。用户可以从列表中选择项目,并且对于每个项目,当选择项目时,文本框中会显示相应的文本。
用户可以编辑此文本框,从而更改列表项的相应文本。
我的问题是:我使用TextChanged事件来检测用户何时输入一些文本并更新事件处理程序中的内部变量,但是当我以编程方式更改文本框的值时也会调用此事件处理程序。我想只在用户更改文本框时调用此处理程序。我怎样才能做到这一点?
编辑:我的组合框也有同样的问题。
答案 0 :(得分:5)
您可以使用 Latch 模式:请参阅Rein in runaway events with the "Latch"
答案 1 :(得分:3)
总是会调用处理程序 - 没有办法禁用它我知道的。但是,您可以在类中设置一个标志,以表明您已经以编程方式更改了状态,并且应该忽略下一个事件。
_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;
}
}
}
答案 2 :(得分:1)
每当TextBox更改其Text属性时都会调用TextChanged事件,这可以通过修改Text属性来实现,或者当用户直接更改文本时,还有其他事件更可能用于您正在尝试的场景实现。
希望有所帮助
答案 3 :(得分:1)
您可以在程序更新中设置一个标志,如果设置了标志,则可以在事件处理程序中提前退出。
但是如果你使用数据绑定,那么变量和gui会自动同步,这样就可以避免这个问题。
答案 4 :(得分:0)
你的意思是你想要第二个文本框显示取决于第一个文本框中的内容的东西,但只有用户确实设置了它?
你能更具体地了解你想要实现的目标吗?在我看来,您的UI设计可能会让用户感到困惑,因为B中的文本有时与A相关,有时则与A无关。
如果您仍想这样做,典型的方法是使用更新标志,如其他答案中所建议的那样。
答案 5 :(得分:0)
检查文本框上的焦点。如果它没有焦点,则表示用户没有编辑它。