Winforms ComboBox:插入符号时的事件?

时间:2012-02-27 21:48:45

标签: c# winforms events combobox

我正在使用WinForms ComboBox构建一种自动完成文本输入,我需要根据插入符号在字符串中的位置来更改自动完成行为。

但是,ComboBox似乎没有公开事件以捕获插入符号位置的更改。我可以在用户输入时抓住TextUpdated。但是当用户导航时,我需要处理KeyDown并检查KeyCodeLeftRightHome还是End。但是,在更改插入符号之前会触发该事件,因此我需要计算新的插入符号位置。这非常烦人,因为当按下Ctrl时需要特殊处理,并且可能还有一些我不知道的特殊辅助功能设置。

所以我想知道是否有更好的方法来做到这一点。每次插入符更改ComboBox中的位置时是否会触发事件,或者KeyDown处理ComboBox事件后我是否可以执行代码?

2 个答案:

答案 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触发一次的计时器并检查插入位置是否已更改。虽然,这将是一个非常糟糕的解决方案。