2012-02-27 65 views
1

我正在使用WinForms ComboBox構建一種自動完成文本輸入,並且我需要自動完成行爲根據插入符在字符串中的位置進行更改。Winforms ComboBox:當插入符號移動時的事件?

但是,ComboBox似乎沒有揭示事件以抓住插入位置的變化。當用戶打字時,我可以捕捉到TextUpdated。但是當用戶正在瀏覽時,我需要處理KeyDown並檢查KeyCode是否爲Left,Right,HomeEnd。但是,在插入符號發生更改之前該事件被解僱,因此我需要計算新的插入符號位置。這非常煩人,因爲按下Ctrl時這需要特殊處理,並且可能存在某些我不知道的特殊輔助功能設置。

所以我想知道是否有更好的方法來做到這一點。每當插入符號在ComboBox中的位置發生變化時是否會發生事件,或者在KeyDown事件由ComboBox處理後是否可以執行代碼?

回答

1

可以的KeyDown處理後立即執行該代碼:

private void comboBox1_KeyDown(object sender, KeyEventArgs e) 
    { 
     BeginInvoke(new MethodInvoker(_CheckCaretPosition)); 
    } 

    void _CheckCaretPosition() 
    { 
     int caretPosition = comboBox1.SelectionStart; 
     Debug.WriteLine(caretPosition); 
    } 
+0

完美,正是我需要的,謝謝! – 2012-02-27 23:43:02

0

@ogggre答案只是解決方案的一半。插入符也可以通過鼠標移動,因此鼠標事件需要相同的事件處理程序,並且通過編程方式(大多數情況下不能通過事件跟蹤)除了更改文本屬性,因此要儘可能靠近跟蹤插入點位置需要這些事件:

private void comboBox1_KeyDown(object sender, KeyEventArgs e) 
{ 
    CheckCaretPosition(); 
} 

private void comboBox1_MouseDown(object sender, MouseEventArgs e) 
{ 
    CheckCaretPosition(); 
} 

private void comboBox1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if((Control.MouseButtons | MouseButtons.Left) != 0) 
     CheckCaretPosition(); 
} 

private void comboBox1_MouseDoubleClick(object sender, MouseEventArgs e) 
{ 
    CheckCaretPosition(); 
} 

private void comboBox1_TextChanged(object sender, EventArgs e) 
{ 
    CheckCaretPosition(); 
} 

void CheckCaretPosition() 
{ 
    int caretPosition = comboBox1.SelectionStart; 
    Debug.WriteLine(caretPosition); 
} 

...,或者,如果你真的需要保持跟蹤插入符組合框在任何情況下,你可以使用它每50-100ms和檢查發射計時器,如果插入符位置改變。雖然,這將是非常糟糕的解決方案。

相關問題