2

我有一个方法

private void textBoxPilot_TextChanged(object sender, TextChangedEventArgs e)
{ ... }

ListBox其中有问题的文本框从用户那里获取一个搜索字符串,并在每次击键时填充结果。

随后,当一个项目被从 中挑选出来时ListBox,我想把选择体现在相同的 中Textbox。但是,我不想触发搜索机制,这会导致Listbox忘记选择。

如何确定TextChanged事件是由用户触发(通过键盘或复制/粘贴)还是由其他方法触发textBoxPilot.Text = "Pilot name";

谢谢。

4

4 回答 4

1

有点hack,但是....

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.
    }
}
于 2010-09-02T20:42:49.433 回答
1

禁用的控件不会触发事件。所以两个选项要么总是禁用更新文本然后重新启用或创建派生类包装器(使用这种方法你仍然可以进行数据绑定)

class myClass : TextBox
{
    public virtual string TextWithoutEvents
    {
        get
        {

            return base.Text;
        }
        set
        {
            bool oldState = Enabled;
            Enabled = false;
            base.Text = value;
            Enabled = oldState;
        }
    }
}
于 2010-09-02T20:43:45.233 回答
0

如果用户从列表中选择“Pilot name”,则将文本框设置为“Pilot name”。这将导致列表框选择“Pilot name”。所以应该保留选择。你只需要打破递归。

于 2010-09-02T20:41:51.663 回答
0

在我的场景中,用户必须输入文本才能触发自动完成,并且当自动完成再次更改文本时我们不希望重新触发,我使用了文本长度。如果用户复制/粘贴并因此使用键盘一次添加超过 1 个字符,这将不起作用。

private void HandleTextChanged(object sender, TextChangedEventArgs e){
    var oldText = e.OldTextValue;
    var newText = e.NewTextValue;

    // Assuming text changed from keyboard is always 1 character longer,
    // ignore this text changed event if new text > 1 character longer.
    if (newText.Length > oldText.Length + 1) {
        return;
    }

    ...
}

在您的场景中,如果您始终知道要跳过的值,则可以改为检查它们:

if (newText == "Pilot name") {
    return;
}

或者

if (myListOfNamesToIgnore.Contains(newText)) {
    return;
}

于 2020-04-01T03:41:15.977 回答