我有一个方法

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”。所以应该保留选择。你只需要打破递归即可。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top