Winforms ComboBox: событие, когда каретка движется? - PullRequest
1 голос
/ 28 февраля 2012

Я строю своего рода автозаполнение ввода текста с использованием WinForms ComboBox, и мне нужно, чтобы поведение автозаполнения менялось в зависимости от положения каретки в строке.

Однако ComboBoxкажется, не выставляет событие, чтобы поймать изменение в позиции каретки.Я могу поймать TextUpdated, когда пользователь печатает.Но когда пользователь перемещается, мне нужно обработать KeyDown и проверить, является ли KeyCode Left, Right, Home или End.Однако событие происходит до смены каретки, поэтому мне нужно вычислить новую позицию каретки.Это очень раздражает, потому что это требует особой обработки при нажатии Ctrl и, возможно, если есть какие-то специальные настройки специальных возможностей, о которых я не знаю.

Так что мне было интересно, есть ли лучший способ сделать это.Есть ли событие, которое запускается каждый раз, когда каретка меняет положение в ComboBox, или есть способ, которым я могу выполнить код после того, как событие KeyDown обработано ComboBox?

Ответы [ 2 ]

1 голос
/ 28 февраля 2012

Вы можете выполнить код сразу после обработки KeyDown:

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

  void _CheckCaretPosition()
  {
       int caretPosition = comboBox1.SelectionStart;
       Debug.WriteLine(caretPosition);
  }
0 голосов
/ 07 сентября 2015

@ 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-100 мс, и проверять, если кареткапозиция изменилась.Хотя это было бы довольно плохим решением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...