2010-06-15 6 views
16

J'essaie de définir le focus sur le nom d'utilisateur TextBox qui se trouve dans un contrôle de connexion ASP.NET.Définir le focus sur la zone de texte dans ASP.NET Contrôle de connexion lors du chargement de la page

J'ai essayé de le faire de deux façons mais aucune ne semble fonctionner. La page est en cours de chargement mais ne va pas au contrôle.

Voici le code que j'ai essayé.

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

Et

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

si vous n'êtes pas sûr de la réussite de 'FindControl()' 'ne pas cast'. Utilisez l'opérateur 'as' car sinon' (TextBox) null' lancera 'NullReferenceException'. Donc, votre vérification de null sera jamais atteint. – abatishchev

+1

Avez-vous convertir votre contrôle de connexion asp.net en modèle? – Aristos

+0

Oui, j'ai converti le contrôle de connexion en modèle. – anD666

Répondre

9

Utilisez-vous un ScriptManager sur la page? Si oui, essayez ce qui suit:

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

Mise à jour: jamais utilisé un MultiView avant, mais essayez ceci:

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

@Aristos - Merci d'avoir signalé cela, j'ai simplement copié et collé ma propre méthode SetInputFocus et j'ai oublié de la changer pour cette question. – GenericTypeTea

+0

Encore rien, il est en train d'arriver à l'instruction 'ScriptManager.GetCurrent (this.Page) .SetFocus (tbox);', mais ne définit toujours pas le focus – anD666

+0

@ anD666 - Mise à jour de ma réponse, essayez-le. Juste une supposition, donc c'est non testé. Je viens de voler l'idée d'un résultat de recherche google. – GenericTypeTea

0

Vous pouvez essayer de faire ce qui suit:

-Inscrivez deux scripts (un pour créer une fonction pour se concentrer sur votre texbox lorsque la page est affichée, deuxièmement pour enregistrer l'identifiant de la zone de texte)

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));    

Comme le résultat que vous devriez obtenir ce qui suit dans votre code:

 <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

Lorsque la page est chargée, le curseur est positionné dans la zone de texte Nom d'utilisateur. Cela fonctionne. Essayez-le. – Rekha

0

J'ai du mal avec cela aussi et je l'ai trouvé une solution qui semble fonctionner très bien même avec des commandes profondément imbriquées (comme AspDotNetStorefront aka ASPDNSF utilise). Notez le code suivant appelé à partir de la routine Page_PreRender. Je connaissais le nom de la TextBox que je voulais mettre au point et donc je viens d'appeler FocusNestedControl(Me, "UserName"). Je viens d'utiliser Me ici parce que tous les besoins de routine est un parent du contrôle pour obtenir le focus; Peu importe le parent.

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

J'utilise Page.Form.DefaultFocus et il fonctionne:

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

Cela a fonctionné pour moi quand rien d'autre n'a fait, merci! – KenD

+0

Ceci devrait être la réponse acceptée. – Marcel

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

} 
0

Mon problème arrized quand je me suis déplacé le contrôle de connexion à un contrôle personnalisé et essayé de trouver UsernameTextBox à la méthode OnInit(). OnInit d'un contrôle est exécuté avant OnInit de Page et c'est pourquoi aucun contrôle de formulaire n'a été créé.

J'ai déplacé l'appel à UsernameTextBox à la fonction OnLoad et cela a fonctionné correctement.

0

Aucune des réponses ci-dessus a fonctionné pour moi, donc je simplement essayé:

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

... et ça a marché!
Avec un ASP TextBox défini comme:

<asp:TextBox ID="TxtMyTextBoxName" type="search" runat="server"></asp:TextBox> 
Questions connexes