Domanda

In WinForms, per focalizzare l'attenzione su un controllo specifico, mi sembra sempre di finire chiamando Control.Select () e Control.Focus () per farlo funzionare.

Qual è la differenza, ed è questo l'approccio corretto?

È stato utile?

Soluzione

  

Focus è un metodo di basso livello destinato principalmente agli autori di controlli personalizzati. Al contrario, i programmatori di applicazioni dovrebbero utilizzare il metodo Select o la proprietà ActiveControl per i controlli figlio o il metodo Activate per i moduli.

http://msdn.microsoft. com / it-it / library / system.windows.forms.control.focus.aspx

Altri suggerimenti

Focus () è la funzione di basso livello che imposta effettivamente il focus.

Seleziona () è un metodo di livello superiore. Per prima cosa guarda verso l'alto nella gerarchia padre del controllo finché non trova un controllo contenitore. Quindi imposta la proprietà ActiveControl del contenitore (sul controllo chiamato). La logica di questi metodi non è tuttavia semplice e esiste una gestione speciale per i contenitori UserControl.

Per un esempio di come sono diversi, se si sta tentando di impostare un controllo per un'app di moduli su cui focalizzare l'attenzione predefinita quando lo si apre, solo Select () funzionerà quando viene chiamato nel costruttore dopo InitializeComponent (). Focus () no.

Solo per aggiungere a questo thread ho scoperto che quando scrivevo un controllo utente che spostava altri controlli da un modulo a un altro (modulo appena creato). La forma originale non poteva più selezionare il controllo, ma utilizzando lo stato attivo gli permetteva di farlo. Penso che ciò enfatizzi le risposte sui livelli a cui lavorano questi metodi. Ma significa anche che non è abbastanza semplice dire usa Seleziona al livello superiore poiché select non ha più funzionato come previsto nella forma originale (non che dovrebbe essere che l'ho inserito in una forma diversa - lo accetto)

Focus (), in alcune situazioni, può far sì che una finestra proprietaria del controllo ottenga focus se non ha focus. Select () non provoca una presa della messa a fuoco dalla finestra.

Per esperienza personale ho scritto un controllo utente ereditando Windows ComboBox. Ho dovuto scrivere il codice per sovrascrivere l'evento OnEnter e avevo una dichiarazione che diceva

If Me.Focused Then ... Else ...

Tuttavia, sfortunatamente ha restituito un risultato inaspettato. Se ho chiamato MyCustomerComboControl.Select (in entrambi gli eventi Load, Shown o Activated), ho chiamato il metodo OnEnter ma non sono riuscito a registrare che aveva il focus (cioè Focused was False) ma se ho chiamato Focus ha funzionato. Inoltre Select ha funzionato se il modulo era aperto, ovvero se ho selezionato un altro controllo, ho nuovamente selezionato il controllo originale e tutto andava bene. Quindi, in qualsiasi altra circostanza diversa dal mio scenario, usa Select perché lo dice sopra.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top