TextChanged が C# のキーボードによってトリガーされたかどうかを確認するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/3631026

質問

私には方法があります

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.
    }
}

他のヒント

無効なコントロールではイベントは発生しません。したがって、2 つのオプションは、テキストの更新を常に無効にしてから再度有効にするか、派生クラス ラッパーを作成するかのいずれかです (この方法を使用してもデータ バインディングを行うことはできます)。

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

            return base.Text;
        }
        set
        {
            bool oldState = Enabled;
            Enabled = false;
            base.Text = value;
            Enabled = oldState;
        }
    }
}

ユーザーがリストから「パイロット名」を選択した場合、テキスト ボックスを「パイロット名」に設定します。これにより、リスト ボックスで「パイロット名」が選択されます。したがって、選択は維持する必要があります。再帰を中断する必要があるだけです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top