2010-04-06 5 views
1

Question: Quelle est la meilleure façon de définir le focus sur un contrôle Web dans ASP .NET.Comment définir le focus sur un contrôle Web dans ASP.NET

Je peux le faire, mais c'est moche. J'ai un contrôle web enveloppé dans un contrôle web hébergé sur une page web. Donc, si vous faites une vue | source sur la page l'identifiant est quelque chose comme WrapperControl_Control_TextBox.

J'ai essayé les méthodes Javascript "éprouvées" pour saisir l'élément et définir son focus: document.getElementByID ("WrapperControl_Control_TextBox") .focus(); et ça n'a pas marché. Je ne suis pas sûr pourquoi.

Je sais que je pourrais peut-être faire: document.getElementById ("<% = TextBox.ClientID%>") .focus(); aussi, je pense. Cela ne fonctionnera pas en raison d'une autre erreur totalement séparée basée sur le fait que vous ne pouvez pas ajouter dynamiquement des contrôles à un en-tête s'il y a un "<%%>" dans la page. GAH.

Dans le contrôle "le plus bas", j'ai essayé de définir le focus (TextBox.Focus() dans Page_Load) et cela ne fonctionne pas non plus. De toute façon, la façon dont cela fonctionne est de simplement prendre la ControlsCollection de la Page, en saisissant le contrôle dont j'ai besoin, en obtenant sa collection, en saisissant le contrôle inférieur suivant et ainsi de suite.

Je dois seulement le faire sept fois. J'ai donc huit boucles foreach.

Fondamentalement, mon code est comme ceci:

/////////////////////////////// // sur la page ///////////////////////////////

ControlCollection controls = Controls; 

foreach(Control control in controls) 
{ 
    if (string.Equals(control.ID, "FormID", StringComparison.InvariantCultureIgnore)) 
    { 
     ControlCollection nextControls = control.Controls; 

     foreach(Control nextControl in nextControls) 
     { 
     if (string.Equals(nextControl.ID, "DivICareAboutInTheForm", StringComparison.InvariantCultureIgnor)) 
     { 
      ControlCollection nextNextControls = nextControl.Controls; 
      //: 
      //: 
      //Yes, it's that bad and so forth. 
      //: 
      //: 
     } 
     } 
    } 
} 

Répondre

2

Vous pouvez utiliser jQuery pour rechercher les ID se terminant par le nom de votre zone de texte. De cette façon, vous n'aurez pas à appeler le code côté serveur UniqueID. Assurez-vous de ne pas avoir de multiples contrôles qui se terminent par le même nom

<script type="text/javascript"> 
     $(document).ready(function() { 
      $('[id$=txtBox]').focus(); 
      }); 
    </script> 

Ou, vous pouvez utiliser un nom de classe pour la zone de texte par défaut.

<asp:Textbox ID="txtBox" runat="server" cCssClass="defaultTextbox" /> 

jquery:

$('.defaultTextbox').focus(); 
+0

Nous n'avons pas JQuery mais je vais chercher à l'ajouter. Merci. – Dan7el

+0

J'ai installé JQuery et rand votre script. Ça marche! Merci beaucoup! – Dan7el

0

Vous pouvez contourner le « ne peut pas ajouter contrôles dynamiques car une erreur <% =%> existe sur la page "en modifiant le bloc pour utiliser la syntaxe de liaison de données: <%# TextBox.ClientID %> et en appelant manuellement Page.DataBind() dans Page_Load.

+0

Intéressant. J'ai essayé le tour <%# %> mais je ne savais pas que j'avais besoin d'ajouter le Page.DataBind(). Je vais regarder ça. Merci. – Dan7el

+0

Je n'ai pas essayé cela puisque la solution JQuery mentionnée ci-dessus fonctionne, mais j'apprécie l'aide. Je pourrais envisager d'utiliser cette technique plus tard. – Dan7el

0

Si vous voulez vraiment utiliser la méthode Page_Load, alors vous pouvez toujours appeler la méthode SetFocus sur l'objet Page.

Page.SetFocus(myTextBox); 
+0

Je vais essayer ça. Merci. – Dan7el

+0

Je n'ai pas essayé cela puisque la solution JQuery mentionnée ci-dessus fonctionne, mais j'apprécie l'aide. Je pourrais envisager d'utiliser cette technique plus tard. – Dan7el

Questions connexes