web-dev-qa-db-fra.com

Définir le focus sur la zone de texte dans le contrôle de connexion ASP.NET lors du chargement de la page

J'essaie de définir le focus sur le nom d'utilisateur TextBox qui se trouve dans un contrôle de connexion ASP.NET.

J'ai essayé de le faire de plusieurs 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
18
anD666

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();
}
10
djdd87

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

// inside page_load, LoginUser is the Login control
Page.Form.DefaultFocus = LoginUser.FindControl("Username").ClientID;
29
Hoang Tran
protected void Page_Load(object sender, EventArgs e)
{
    SetFocus(LoginCntl.FindControl("UserName"));
}
1
Rekha

Aucune des réponses ci-dessus n'a fonctionné pour moi, alors j'ai simplement essayé:

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

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

<asp:TextBox ID="TxtMyTextBoxName" type="search" runat="server"></asp:TextBox>
0
LePatay

J'ai également eu du mal avec cela et j'ai trouvé une solution qui semble très bien fonctionner même avec des contrôles profondément imbriqués (comme AspDotNetStorefront a.k.a. ASPDNSF utilise). Notez le code suivant appelé à partir de la routine Page_PreRender. Je connaissais le nom de la zone de texte sur laquelle je voulais me concentrer et je me suis contenté d'appeler FocusNestedControl(Me, "UserName"). Je viens d'utiliser Me ici parce que tous les besoins de routine sont un parent du contrôle pour obtenir le focus; peu importe quel 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
0
cjbarth

Vous pouvez essayer de faire ce qui suit:

-Enregistrez deux scripts (un pour créer une fonction permettant de se concentrer sur votre texte lorsque la page est affichée, ensuite 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));             

En conséquence, 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>
0
Konrad

Vous pouvez définir le focus directement sur LoginControl et celui-ci sera automatiquement défini sur le premier champ sous contrôle. Dans ton cas:

this.loginForm.Focus();

Plus d'informations sur MSDN: Comment: définir le focus sur les contrôles serveur Web ASP.NET

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

}
0
Mario

Mon problème est arrivé lorsque j'ai déplacé le contrôle de connexion vers un contrôle personnalisé et que j'ai essayé de trouver UsernameTextBox à la méthode OnInit () . OnInit d'un contrôle est exécuté avant OnInit of Page, ce qui explique l'absence de contrôle de formulaire. 

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

0
Menelaos Vergis