2012-08-10 15 views
5

Visual Studio 2010, C#Cómo habilitar un botón WinForm a tiempo para recibir el foco tabulando

Tengo un ComboBox con un DropDown, AutoComplete conjunto de SuggestAppend y la AutoCompleteSource es de la ListItems. El usuario ingresa los datos hasta que tengan la entrada correcta. Hasta que los datos coincidan con uno de los elementos de la lista, se desactiva un botón al lado del cuadro combinado.

Si el usuario presiona la tecla de tabulación, la función de autocompletar acepta la sugerencia actual. También pasa al siguiente control en la secuencia de pestañas que está habilitado. Por supuesto, dado que quiero que vaya al botón deshabilitado, necesito habilitarlo tan pronto como valide la entrada.

El problema es que ninguno de los eventos que he intentado, PreviewKeyDown, LostFocus, SelectedIndexChanged me permiten habilitar el botón a tiempo para que se procese y reciba el enfoque. Siempre va al siguiente botón en orden de tabulación que siempre está habilitado.

Estoy a punto de dejar el botón habilitado y dar un error si lo presiono demasiado pronto, pero no quiero hacerlo de esa manera. Tampoco quiero entrar en indicadores de modo especial para realizar un seguimiento de cuándo estos controles reciben atención. La validación parece ser algo normal, pero estoy atascado.

Si el SelectedIndexChanged funcionó cuando el usuario hizo una coincidencia, esto sería fácil. No se dispara cuando se borra la casilla ni cuando se encuentra una coincidencia. evento

+0

Use el evento TextChanged. –

Respuesta

0
try this : 

KEY_PRESS:

if (e.KeyData == Keys.Enter) 
     { 
      button2.Enabled = true; 
      button2.Focus(); 
     } 
+0

Esto no actúa en la tecla Tab. Además, el evento KeyPress no proporciona KeyData. –

0

En lugar de los hanlders evento que usted ha mencionado, (LostFocus, SelectedIndexChanged y PreviewKeyDown) utilizar el evento "Validado" de la lista desplegable para establecer el estado de activación del botón.

Es posible que también deba enfocar manualmente el botón para forzar el enfoque.

p. Ej.

private void comboBox1_Validated(object sender, EventArgs e) 
    { 
     button1.Enabled = true; 
     button1.Focus(); 
    } 
+1

La asignación del foco en la validación supone demasiado. Asumiendo que permanecería allí, ¿qué pasaría si el usuario hiciera clic en otro botón del formulario? También se advierte en contra en la ayuda. Mira mi comentario a ahazzah. –

+0

Esa es una llamada justa. No entendí lo que querías decir con "Quiero que vaya al botón desactivado".Después de volver a leer, está claro que quieres decir que quieres ese comportamiento si el usuario pulsa la tecla de tabulación. –

1

Puede crear su propia clase ComboBox para encapsular este comportamiento. Algo como esto:

using System; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 

      this.myComboBox1.TheButton = this.button1; 

      this.myComboBox1.Items.AddRange(new string[] { 
       "Monday", 
       "Tuesday", 
       "Wednesday", 
       "Thursday", 
       "Friday", 
       "Saturday", 
       "Sunday" 
      }); 

      button1.Enabled = false; 
     } 
    } 

    public class MyComboBox : ComboBox 
    { 
     public Control TheButton { get; set; } 

     public MyComboBox() 
     { 
     } 

     bool IsValidItemSelected 
     { 
      get { return null != this.SelectedItem; } 
     } 

     protected override void OnValidated(EventArgs e) 
     { 
      if (null != TheButton) 
      { 
       TheButton.Enabled = this.IsValidItemSelected; 
       TheButton.Focus(); 
      } 

      base.OnValidated(e); 
     } 

     protected override void OnTextChanged(EventArgs e) 
     { 
      if (null != TheButton) 
      { 
       TheButton.Enabled = this.IsValidItemSelected; 
      } 

      base.OnTextChanged(e); 
     } 
    } 
} 
+0

Gracias por tomarse el tiempo para crear esto. Un problema es que el foco de los botones se establece en el evento OnValidated. La Ayuda de VS2010 establece "No intente establecer el foco desde los controladores de eventos Intro, GotFocus, Abandono, Perdido, Validación o Validado. Si lo hace, su aplicación o el sistema operativo dejarán de responder". En segundo lugar, los eventos de validación tienen lugar después del evento Leave, que también es demasiado tarde, por lo que no parece que pueda hacer lo que quiero de forma nativa. –

+0

"Así que no parece que puedo hacer lo que quiero". La aplicación de prueba que creé en mi respuesta hace lo que quiere. ¿Lo intentaste? – ahazzah

+0

No, no lo hice porque la advertencia parecía ser muy específica. Funciona. Con un poco más de tweeking, habilitará el botón tan pronto como el usuario termine de escribir. Tengo otra solución que utiliza un reemplazo de formulario de ProcessCmdKey que no infringe la advertencia. Probablemente estoy siendo literal, pero soy nuevo en .Net después de trabajar los últimos 15 años haciendo Win32 con Delphi y hay suficientes diferencias que soy cauteloso. –

0

Con un poco de pensamiento a las otras respuestas aquí me ocurrió un senario parcial que funciona sin necesidad de utilizar Autocompletar . Un efecto secundario es que el evento PreviewKeyDown se llama por segunda vez y, por lo tanto, la validación se llama dos veces. Me pregunto por qué ... tal vez debería hacer otra pregunta.

private void comboBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) { 
     if (e.KeyData == Keys.Tab) { 
     if (ValidationRoutine()) { 
      e.IsInputKey = true; //If Validated, signals KeyDown to examine this key 
     } //Side effect - This event is called twice when IsInputKey is set to true 
     }   
    } 

    private void comboBox1_KeyDown(object sender, KeyEventArgs e) { 
     if (e.KeyData == Keys.Tab) { 
      e.SuppressKeyPress = true; //Stops further processing of the TAB key 
      btnEdit.Enabled = true; 
      btnEdit.Focus(); 
     } 
    } 

Una vez que encienda AutoCompleteMode con cualquier valor distinto de None, el evento KeyDown no se dispara para Tab más la tecla se come en silencio.

Cuestiones relacionadas