Winforms c#: imposta lo stato attivo sul primo controllo figlio di TabPage
Domanda
Diciamo che ho un Textbox
nidificato all'interno di a TabControl
.
Quando il modulo viene caricato, vorrei concentrarmi su quello Textbox
(per impostazione predefinita il focus è impostato su TabControl
).
Semplicemente chiamando textbox1.focus()
nel Load
l'evento del modulo non sembra funzionare.
Sono stato in grado di focalizzarlo facendo quanto segue:
private void frmMainLoad(object sender, EventArgs e)
{
foreach (TabPage tab in this.tabControl1.TabPages)
{
this.tabControl1.SelectedTab = tab;
}
}
La mia domanda è:
Esiste un modo più elegante per farlo?
Soluzione
La seguente è la soluzione:
private void frmMainLoad(object sender, EventArgs e)
{
ActiveControl = textBox1;
}
La domanda migliore sarebbe tuttavia: perché...Non sono del tutto sicuro di quale sia la risposta a questa domanda.
Modificare:Sospetto che abbia qualcosa a che fare con il fatto che sia il modulo che il TabControl sono contenitori, ma non ne sono sicuro.
Altri suggerimenti
Prova a inserirlo nel Form_Shown()
evento.Poiché è in un contenitore, l'inserimento del costruttore Form_Load o anche del costruttore Form() non funzionerà.
Prova ad usare textbox1.Select()
invece di textbox1.Focus()
.Questo mi ha aiutato alcune volte.
Devi solo aggiungere Control.Select() per il tuo controllo a questo codice.L'ho usato per focalizzare l'attenzione sui controlli durante la convalida quando si verificano errori.
private void ShowControlTab(Control ControlToShow)
{
if (!TabSelected)
{
if (ControlToShow.Parent != null)
{
if (ControlToShow.Parent.GetType() == typeof(TabPage))
{
TabPage Tab = (TabPage)ControlToShow.Parent;
if (WOTabs.TabPages.Contains(Tab))
{
WOTabs.SelectedTab = Tab;
TabSelected = true;
return;
}
}
ShowControlTab(ControlToShow.Parent);
}
}
}
Avevo un controllo utente all'interno di un altro controllo utente.textbox1.Select() ha funzionato per me ma textbox1.Focus() non ha funzionato.
Puoi anche provare a impostare TabStop su false, textbox1.Focus(), TabStop true.
private void ChildForm1_Load(object sender, EventArgs e)
{
ActiveControl = txt_fname;
}
Io uso questo codice e funziona bene sul controllo della scheda win o sul controllo supertab dotnetbar