2012-02-27 54 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和检查发射计时器,如果插入符位置改变。虽然,这将是非常糟糕的解决方案。

相关问题