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
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();
}
J'utilise Page.Form.DefaultFocus et cela fonctionne:
// inside page_load, LoginUser is the Login control
Page.Form.DefaultFocus = LoginUser.FindControl("Username").ClientID;
protected void Page_Load(object sender, EventArgs e)
{
SetFocus(LoginCntl.FindControl("UserName"));
}
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>
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
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>
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
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
Login.FindControl("UserName").Focus();
}
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.