2011-08-26 9 views
6

Attualmente nella mia applicazione è impossibile deselezionare una casella di testo. L'unico modo è selezionare un'altra casella di testo. I miei utenti e io sono d'accordo che facendo clic su qualsiasi altra parte del modulo dovrebbe deselezionare la casella di testo corrente. Ho provato a scavalcare MouseDown su molti controlli e ho impostato il focus su un'etichetta casuale, ma non funziona con alcuni controlli come MenuStrip o scrollbars. Qualche idea?Come deselezionare la casella di testo se l'utente fa clic altrove nel modulo?

+2

Qual è la logica di un tale requisito? In che modo questo avvantaggia i tuoi utenti? – cdhowie

+0

Che piattaforma stai usando? WinForms, ASP.NET, WPF? –

+0

@Kevin: Winform C# –

risposta

2

Supponendo che non vi siano altri controlli sul forum, provare ad aggiungere un controllo Panel che può essere attivato.

Impostare la TabIndex sul Panel controllo per qualcosa di meno che il vostro TextBox o NumericUpDown controllo ha.

Ora, quando il modulo principale riceve lo stato attivo, lo Panel deve ricevere lo stato attivo anziché l'area .

ScreenShot

+0

Questo non risolve il mio problema. Non voglio che vengano abilitati o disabilitati, ma li fanno perdere la messa a fuoco quando l'utente fa clic in altro modo. Inoltre, questo rileva solo i clic del modulo e non controlla i clic sul modulo. –

+0

Se il controllo è disabilitato, non riceverà i messaggi del mouse e non riceverà lo stato attivo. –

+0

Sì ma lo disabilita solo (che non desidero) quando l'utente fa clic su un'area vuota nel * modulo *. –

0

ho qualche sorta di "soluzione" per voi. Solo un altro controllo (che può mettere a fuoco) in background. Ho provato questo per un GridView (che dipingerà il tuo grigio di controllo) - ma dovresti essere in grado di farlo con un controllo personalizzato nel colore che desideri o semplicemente impostare il backgroundcolor di gridview (doh). In questo modo, ogni volta che l'utente fa clic sullo sfondo, questo backgroundcontrol ottiene l'attenzione.

+0

Anche questo non funziona. Cambia semplicemente il contenitore per tutti i controlli dal modulo al pannello. Lo stesso problema esiste ancora. –

1

Dal momento che probabilmente hai un'etichetta, o qualsiasi altro controllo sul tuo winform, andrei con la soluzione recommended here e darei il focus su un'etichetta quando si fa clic sul modulo.

Nel peggiore dei casi, è anche possibile aggiungere un'etichetta situata nella posizione -100, -100, impostarlo come primo nell'ordine di tabulazione e Focus() sul clic del modulo.

2

Ho avuto un problema simile di recente. La mia interfaccia è molto complessa con molti pannelli e schede, quindi nessuna delle risposte più semplici che ho trovato ha funzionato.

La mia soluzione era di aggiungere un gestore di clic del mouse a ogni controllo non focalizzabile nel mio modulo, che avrebbe cercato di mettere a fuoco le etichette sul modulo. La messa a fuoco di un'etichetta specifica non funzionerebbe quando si trovava su una scheda diversa, quindi ho finito per eseguire il looping e mettere a fuoco tutte le etichette.

Codice di realizzare è la seguente:

private void HookControl(Control controlToHook) 
    { 
     // Add any extra "unfocusable" control types as needed 
     if (controlToHook.GetType() == typeof(Panel) 
      || controlToHook.GetType() == typeof(GroupBox) 
      || controlToHook.GetType() == typeof(Label) 
      || controlToHook.GetType() == typeof(TableLayoutPanel) 
      || controlToHook.GetType() == typeof(FlowLayoutPanel) 
      || controlToHook.GetType() == typeof(TabControl) 
      || controlToHook.GetType() == typeof(TabPage) 
      || controlToHook.GetType() == typeof(PictureBox)) 
     { 
      controlToHook.MouseClick += AllControlsMouseClick; 
     } 
     foreach (Control ctl in controlToHook.Controls) 
     { 
      HookControl(ctl); 
     } 
    } 
    void AllControlsMouseClick(object sender, MouseEventArgs e) 
    { 
     FocusLabels(this); 
    } 
    private void FocusLabels(Control control) 
    { 
     if (control.GetType() == typeof(Label)) 
     { 
      control.Focus(); 
     } 
     foreach (Control ctl in control.Controls) 
     { 
      FocusLabels(ctl); 
     } 
    } 

E poi aggiungere questo al vostro evento Form_Load:

HookControl(this);