2010-06-15 11 views
16

Sto cercando di impostare lo stato attivo sul nome utente TextBox che si trova all'interno di un controllo di accesso di ASP.NET.Impostare lo stato attivo sulla casella di testo nel controllo di accesso ASP.NET al caricamento della pagina

Ho provato a farlo in un paio di modi, ma nessuno sembra funzionare. La pagina si sta caricando ma non sta andando al controllo.

Ecco il codice che ho provato.

SetFocus(this.loginForm.FindControl("UserName")); 

E

TextBox tbox = (TextBox)this.loginForm.FindControl("UserName"); 
if (tbox != null) 
{  
    tbox.Focus(); 
} // if 
+2

se non siete sicuri nel successo di 'FindControl()' 'non cast'. Usa l'operatore 'as' perché altrimenti' (TextBox) null' genererà 'NullReferenceException'. Quindi il tuo null-check non sarà mai raggiunto. – abatishchev

+1

Hai convertito il tuo controllo login asp.net in template? – Aristos

+0

Sì, ho convertito il controllo di accesso in un modello. – anD666

risposta

9

Stai usando uno ScriptManager sulla pagina? In tal caso, provare quanto segue:

public void SetInputFocus() 
{ 
    TextBox tbox = this.loginForm.FindControl("UserName") as TextBox; 
    if (tbox != null) 
    { 
     ScriptManager.GetCurrent(this.Page).SetFocus(tbox); 
    } 
} 

Aggiornamento: mai usato un multiview prima, ma provate questo:

protected void MultiView1_ActiveViewChanged(object sender, EventArgs e) 
{ 
    SetInputFocus(); 
} 
+0

@Aristos - Grazie per averlo indicato, ho appena copiato e incollato il mio metodo SetInputFocus e ho dimenticato di cambiarlo per questa domanda. – GenericTypeTea

+0

Ancora niente, si arriva alla proposizione 'ScriptManager.GetCurrent (this.Page) .SetFocus (tbox);' ma non imposta ancora lo stato attivo – anD666

+0

@ anD666 - Aggiornato la mia risposta, provatelo. Solo una supposizione, quindi non è stata testata. Ho appena rubato l'idea di un risultato di ricerca su Google. – GenericTypeTea

0

Si può tentare di effettuare le seguenti operazioni:

-register due script (uno per creare una funzione per concentrarsi sulla tua texbox quando viene visualizzata la pagina, in secondo luogo per registrare l'id della casella di testo)

this.Page.ClientScript.RegisterStartupScript(this.GetType(), "on_load", 
       "<script>function window_onload() \n { \n if (typeof(idLoginTextBox) == \"undefined\" || idLoginTextBox == null) \n return; \n idLoginTextBox.focus();\n } \n window.onload = window_onload; </script>"); 

this.Page.ClientScript.RegisterStartupScript(this.GetType(), "Focus", String.Format("<script>var idLoginTextBox=document.getElementById(\"{0}\").focus();</script>", this.loginForm.ClientID));    

Come risultato si dovrebbe ottenere il seguente nel codice:

 <script> 
      function window_onload() 
      { 
      if (typeof(idLoginTextBox) == "undefined" || idLoginTextBox == null) 
       return;  
      idLoginTextBox.focus(); 
     } 
     window.onload = window_onload;  
     </script> 



<script> 
     var idLoginTextBox=document.getElementById("ctl00_LoginTextBox").focus(); 
    </script> 
1
protected void Page_Load(object sender, EventArgs e) 
{ 
    SetFocus(LoginCntl.FindControl("UserName")); 
} 
+3

Quando la pagina viene caricata, il cursore viene posizionato nella casella di testo del nome utente. Funziona. Per favore provalo – Rekha

0

ho lottato con questo troppo e ho trovato una soluzione che sembra funzionare molto bene anche con i controlli di nidificazione (come AspDotNetStorefront, ovvero gli usi di ASPDNSF). Notare il seguente codice chiamato dalla routine Page_PreRender. Conoscevo il nome del TextBox su cui volevo concentrarmi e quindi ho appena chiamato FocusNestedControl(Me, "UserName"). Ho appena usato Me qui perché tutte le esigenze di routine sono un genitore del controllo per ottenere l'attenzione; non importa quale genitore.

Public Function FocusNestedControl(ByVal ParentControl As Control, ByVal ControlNameToFocus As String) As Control 

     If ParentControl.HasControls Then 
      For Each childCtrl As Control In ParentControl.Controls 
       Dim goodCtrl As Control = FocusNestedControl(childCtrl, ControlNameToFocus) 
       If goodCtrl IsNot Nothing Then 
        goodCtrl.Focus() 
        Return goodCtrl 
       End If 
      Next 
     Else 
      If ParentControl.ID = ControlNameToFocus Then 
       ParentControl.Focus() 
       Return ParentControl 
      End If 
     End If 

     Return Nothing 
    End Function 
28

sto usando Page.Form.DefaultFocus e funziona:

// inside page_load, LoginUser is the Login control 
Page.Form.DefaultFocus = LoginUser.FindControl("Username").ClientID; 
+1

Questo ha funzionato per me quando nient'altro ha funzionato, grazie! – KenD

+0

Questa dovrebbe essere la risposta accettata. – Marcel

0
protected override void OnPreRender(EventArgs e) 
{ 
     base.OnPreRender(e); 
     Login.FindControl("UserName").Focus(); 

} 
0

Il mio problema arrized quando mi sono trasferito il controllo di accesso per un controllo personalizzato e cercato di trovare UsernameTextBox presso il metodo() OnInit. OnInit di un controllo viene eseguito prima di OnInit di Page ed è per questo motivo che non è stato creato alcun controllo Form.

Ho spostato la chiamata su UsernameTextBox sulla funzione OnLoad e ha funzionato correttamente.

0

Nessuna delle risposte di cui sopra ha funzionato per me, così ho semplicemente cercato:

protected void Page_Load(object sender, EventArgs e) { 
    // This works for me 
    TxtMyTextBoxName.Focus(); 
} 

... e ha funzionato!
Con una TextBox ASP definito come:

<asp:TextBox ID="TxtMyTextBoxName" type="search" runat="server"></asp:TextBox> 
Problemi correlati