2012-08-10 5 views
5

Visual Studio 2010, C#Come attivare un pulsante WinForm in tempo per ricevere attenzione da tabulazione

Ho un ComboBox con un DropDown, AutoComplete insieme al SuggestAppend e il AutoCompleteSource è dal ListItems. L'utente digita i dati in esso fino a quando non ha la voce corretta. Utilizza i dati corrispondenti a uno degli elementi dell'elenco, un pulsante accanto alla casella combinata è disabilitato.

Se l'utente preme il tasto Tab, la funzione di completamento automatico accetta il suggerimento corrente. Passa anche al controllo successivo in sequenza di tabulazioni abilitato. Naturalmente dal momento che voglio che passi al pulsante disabilitato, devo abilitarlo non appena convalido la voce.

Il problema è che nessuno degli eventi che ho provato, PreviewKeyDown, LostFocus, SelectedIndexChanged mi permette di attivare il pulsante in tempo per essere proccessed e ricevere la messa a fuoco. Va sempre al prossimo pulsante in ordine di tabulazione che è sempre abilitato.

Sono quasi pronto a lasciare il pulsante abilitato e farmi dare un errore se premuto troppo presto ma non voglio farlo in quel modo. Inoltre, non voglio entrare in modalità speciale per tenere traccia di quando questi controlli ricevono attenzione. La convalida sembra essere una cosa normale, ma sono bloccato.

Se il SelectedIndexChanged ha funzionato quando l'utente ha effettuato una corrispondenza, ciò sarebbe stato facile. Non si attiva quando la casella si cancella o quando viene trovata una corrispondenza tipizzata. evento

+0

Utilizzare l'evento TextChanged. –

risposta

0
try this : 

key_press:

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

Questo non funziona sul tasto Tab. Anche l'evento KeyPress non fornisce KeyData. –

0

Invece delle hanlders evento che hai citato, (LostFocus, SelectedIndexChanged e PreviewKeyDown) utilizzare l'evento "Validated" della vostra casella combinata per impostare lo stato abilitato del pulsante.

Potrebbe essere necessario anche mettere a fuoco manualmente il pulsante per forzare il focus a spostarsi su di esso.

ad es.

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

L'assegnazione dello stato attivo nella convalida presuppone troppo. Asumming sarebbe rimasto lì, e se l'utente ha fatto clic su un altro pulsante sul modulo? È anche messo in guardia contro nell'aiuto. Vedi il mio commento ad ahazzah. –

+0

Questa è una chiamata giusta. Ho frainteso cosa intendevi per "Voglio che vada al pulsante disabilitato".Dopo la rilettura, è chiaro che intendi, vuoi quel comportamento se l'utente preme il tasto tab. –

1

È possibile creare la propria classe ComboBox per incapsulare questo comportamento. Qualcosa di simile a questo:

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

Grazie per aver dedicato del tempo per creare questo. Un problema è che l'attivazione dei pulsanti viene impostata nell'evento OnValidated. La Guida di VS2010 recita "Non tentare di impostare lo stato attivo all'interno dei gestori di eventi Enter, GotFocus, Leave, LostFocus, Validating o Validated, altrimenti l'applicazione o il sistema operativo potrebbero bloccarsi." Secondariamente gli eventi di validazione avvengono dopo l'evento Leave, che è anche troppo tardi, quindi non sembra che io possa fare ciò che voglio in modo nativo. –

+0

"Quindi non sembra che io possa fare quello che voglio." L'applicazione di prova che ho creato nella mia risposta fa quello che vuoi. Hai provato? – ahazzah

+0

No, non l'ho fatto perché la cautela sembrava essere molto specifica. Funziona. Con un po 'più di tweeking, abiliterebbe il pulsante non appena l'utente ha terminato di digitare. Ho un'altra soluzione che utilizza un override del modulo di ProcessCmdKey che non viola l'avviso. Probabilmente sto andando oltre il letterale ma sono nuovo a .Net dopo aver lavorato negli ultimi 15 anni facendo Win32 con Delphi e ci sono abbastanza differenze che sono cauto. –

0

Con qualche pensiero alle altre risposte qui mi si avvicinò con un senario parziale, che funziona senza l'utilizzo di automatico. Un effetto collaterale è che l'evento PreviewKeyDown viene chiamato una seconda volta e pertanto la convalida viene chiamata due volte. Mi chiedo perché ... forse dovrei fare un'altra domanda.

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 volta che si accende AutoCompleteMode con un'impostazione diversa da None, l'evento KeyDown non si attiva per Tab più la chiave è in silenzio mangiato.

Problemi correlati