visual studio form evento c# winforms textbox keyevent

c# - studio - Manejo de eventos clave de flecha en un cuadro de texto winform sin anular



keypress form c# (2)

Puede que no entienda completamente tu pregunta, pero ¿no funcionaría un enfoque como este?

private void textBox1_KeyDown(object sender, KeyEventArgs e) { comboBox1.Text = //results of your matching algorithm. } private void textBox1_Validated(object sender, EventArgs e) { textBox1.Text = (string) comboBox1.Text; }

Tengo una situación en la que se me proporciona una instancia de WinForms TextBox a la que deseo adjuntar funcionalidad de autocompletar.

Tengo el autocompletar (coincidencia de cadena + menú desplegable) todo resuelto y funciona confiable hasta el momento.

¿Cuál es la capacidad de navegar por el menú desplegable con el teclado (como es la norma con este tipo de interfaz de usuario).

La solución natural sería manejar el evento KeyDown (o somesuch) para el cuadro de texto y mover la selección en el menú desplegable en consecuencia.

Sin embargo, sucede que para hacer esto, debe anular el evento IsInputKey() para permitir la captura de eventos de tecla de flecha. La alternativa es anular ProcessCmdKey() y manejar el evento allí. El problema con estos dos es que no puedo anular nada ya que no puedo reemplazar la instancia del cuadro de texto.

Editar: Supongamos que tengo el siguiente código:

void _textBox_KeyDown(object sender, KeyEventArgs e) { if (_dropdown.Visible) { // TODO The stuff below fails because we need to either handle ProcessCmdKey or override IsInputKey switch (e.KeyCode) { case Keys.Tab: { // click selected item _dropdown.Items[GetSelectedItemIndex()].PerformClick(); break; } case Keys.Down: { // select next (or first) item int i = GetSelectedItemIndex() + 1; if (i >= _dropdown.Items.Count) i = 0; _dropdown.Items[i].Select(); break; } case Keys.Up: { // select previous (or last) item int i = GetSelectedItemIndex() - 1; if (i < 0) i = _dropdown.Items.Count - 1; _dropdown.Items[i].Select(); break; } } } }

El problema con el código anterior es que nunca se llama . El evento nunca se desencadena para las teclas de flecha . Más información: las teclas de flecha arriba, abajo, izquierda y derecha no disparan el evento KeyDown