我正在使用WinForms ComboBox
构建一种自动完成文本输入,我需要根据插入符号在字符串中的位置来更改自动完成行为。
但是,ComboBox
似乎没有公开事件以捕获插入符号位置的更改。我可以在用户输入时抓住TextUpdated
。但是当用户导航时,我需要处理KeyDown
并检查KeyCode
是Left
,Right
,Home
还是End
。但是,在更改插入符号之前会触发该事件,因此我需要计算新的插入符号位置。这非常烦人,因为当按下Ctrl时需要特殊处理,并且可能还有一些我不知道的特殊辅助功能设置。
所以我想知道是否有更好的方法来做到这一点。每次插入符更改ComboBox
中的位置时是否会触发事件,或者KeyDown
处理ComboBox
事件后我是否可以执行代码?
答案 0 :(得分:1)
您可以在KeyDown处理后立即执行代码:
private void comboBox1_KeyDown(object sender, KeyEventArgs e)
{
BeginInvoke(new MethodInvoker(_CheckCaretPosition));
}
void _CheckCaretPosition()
{
int caretPosition = comboBox1.SelectionStart;
Debug.WriteLine(caretPosition);
}
答案 1 :(得分: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);
}
...或者,或者,如果您真的需要在任何情况下都在ComboBox中跟踪插入符号,您可以使用每50-100ms触发一次的计时器并检查插入位置是否已更改。虽然,这将是一个非常糟糕的解决方案。