C#中如何判断TextChanged是否是键盘触发的?
-
26-09-2019 - |
题
我有一个方法
private void textBoxPilot_TextChanged(object sender, TextChangedEventArgs e)
{ ... }
其中有问题的文本框从用户处获取搜索字符串并填充 ListBox
每次击键的结果。
随后,当从 ListBox
, ,我希望选择反映在相同的 Textbox
. 。但是,我不想触发搜索机制,这会导致 Listbox
忘记它的选择。
如何判断是否 TextChanged
事件由用户触发(通过键盘或复制/粘贴)或使用其他方法触发 textBoxPilot.Text = "Pilot name";
?
谢谢。
解决方案
有点黑客,但是......
public class MyForm : Form
{
private bool _ignoreTextChanged;
private void listView1_SelectionChanged( object sender, EventArgs e )
{
_ingnoreTextChanged = true;
textBoxPilot.Text = listView1.SelectedValue.ToString(); // or whatever
}
private void textBoxPilot_TextChanged( object sender, TextChangedEventArgs e )
{
if( _ignoreTextChanged )
{
_ignoreTextChanged = false;
return;
}
// Do what you would normally do.
}
}
其他提示
禁用的控件不会触发事件。因此,两个选项是始终禁用更新文本,然后重新启用或创建派生类包装器(使用此方法您仍然可以进行数据绑定)
class myClass : TextBox
{
public virtual string TextWithoutEvents
{
get
{
return base.Text;
}
set
{
bool oldState = Enabled;
Enabled = false;
base.Text = value;
Enabled = oldState;
}
}
}
如果用户从列表中选择“Pilot name”,则将文本框设置为“Pilot name”。这将导致列表框选择“Pilot name”。所以应该保留选择。你只需要打破递归即可。
不隶属于 StackOverflow