2010-09-02 81 views
2

我有一個方法如何確定TextChanged是否由C#中的鍵盤觸發?

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

如有關的文本需要來自用戶的搜索字符串,並填充與每個按鍵的結果ListBox

隨後,當從ListBox中挑選物品時,我希望選擇反映在相同的Textbox中。但是,我不想觸發搜索機制,這會導致Listbox忘記選擇。

如何確定TextChanged事件是由用戶(通過它們的鍵盤還是複製/粘貼)還是由其他方法使用textBoxPilot.Text = "Pilot name";觸發的?

謝謝。

回答

1

黑客攻擊的一位,但是....

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

最後我用你的答案和斯科特的回答的組合: 私人無效listBoxPilot_SelectionChanged(對象發件人,SelectionChangedEventArgs E) { textBoxPilot.IsEnabled = FALSE; Member selectedPilot =(Member)listBoxPilot.SelectedItem; textBoxPilot.Text = selectedPilot.firstName; textBoxPilot.IsEnabled = true; } 私人無效textBoxPilot_TextChanged(對象發件人,TextChangedEventArgs E) { 如果(textBoxPilot.IsEnabled == FALSE) 回報; [search stuff] } 這消除了對新的全局變量的需求。感謝你們倆。 – Anders 2010-09-02 21:56:00

0

如果用戶從列表中選擇「試用名」,則將文本框設置爲「試用名」。這將導致列表框選擇「試點名稱」。所以選擇應該保留。你只需要打破遞歸。

+0

真正創建一個派生類的包裝,但是,它在這種情況下,不走。用戶偶爾會使用箭頭鍵瀏覽結果,並且ListBox會隨時選擇每個項目。 – Anders 2010-09-02 21:11:50

1

禁用的控制,將不會觸發一個事件。所以兩個選擇要麼永遠禁止更新文本,然後重新啓用或(使用這種方法,你仍然可以做數據綁定)

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

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

感謝您的靈感。最後,我用了你的答案和耶羅德答案的結合。看到我對他帖子的回覆。 – Anders 2010-09-02 21:57:40

相關問題