À l'aide de FindControl: l'Accès aux Contrôles dans un Formview
Je suis l'élaboration d'une simple Liste de Mariage application, où vous pourrez vous réserve les présentes, qu'ils veulent acheter pour la mariée et le marié. La Réserve de la page enveloppe un peu de champs à l'intérieur d'un couple de panneaux, le tout enveloppé à l'intérieur d'un FormView.
L'utilisateur entre son nom, e-mail et la quantité des articles que vous souhaitez réserver et faire les réservations nécessaires dans la base de données.
Mon premier problème était que, dans FormView_ItemCommand, je ne pouvais pas faire référence à un des autres contrôles dans le FormView.... J'ai pensé que c'était un cas pour FindControl - mais pourquoi ai-je besoin d'un Formview lorsque je n'ai jamais eu besoin pour ListViews ou DetailViews?
Deuxièmement, je sais que le code suivant fonctionne..
Dim oCtrl as TextBox = Me.fvwReservation.FindControl("txtEmail")
Dim Test As String = oCtrl.Text
...mais pourquoi je ne peux pas utiliser...
Dim Test As String = Me.fvwReservation.FindControl("txtEmail").Text
??
Enfin, je ne pense pas que j'en ai besoin, à cette occasion, mais j'ai fait des recherches récursives FindControl variantes, mais je n'ai pas réellement trouvé un qui fait la compile! Des suggestions?
C'est beaucoup pour un post - merci à l'avance.
Gratuite Extrait De Code:
<asp:FormView ID="fvwReservation" runat="Server" DataSourceID="dsGift">
<ItemTemplate>
<asp:Panel runat="server" ID="pnlDetails">
<h3>Reserve Item: <%#Eval("ShortDesc")%></h3>
<p>You have chosen to reserve the <em><%#Eval("LongDesc")%></em> gift.</p>
<p>Please enter your details below to confirm the reservation.</p>
</asp:Panel>
<asp:Panel runat="server" ID="pnlConfirm">
<div class="row">
<asp:Label runat="server" CssClass="label">Name:</asp:Label><asp:TextBox ID="txtName" MaxLength="50" runat="server" CssClass="Field" />
<asp:RequiredFieldValidator ID="rfvName" runat="server" ErrorMessage="You must specify your Name" ControlToValidate="txtName" />
</div>
<div class="row">
<asp:Label runat="server" CssClass="label">Email:</asp:Label><asp:TextBox ID="txtEmail" MaxLength="100" runat="server" CssClass="Field"/>
<asp:RequiredFieldValidator ID="rfvEmail" runat="server" ErrorMessage="You must specify your Email Address" ControlToValidate="txtEmail" />
<asp:RegularExpressionValidator ID="regexEmail" ValidationExpression="^(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9]+@((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6}$" runat="server" ErrorMessage="Please enter a valid Email Address" ControlToValidate="txtEmail" />
</div>
<div class="row">
<asp:Label runat="server" CssClass="label">Quantity (max <%#Eval("QtyRemaining")%>):</asp:Label><asp:TextBox ID="iQty" MaxLength="2" runat="server" CssClass="Field" />
<asp:RangeValidator ID="rvQty" runat="server" ErrorMessage="The Quantity mmust be between 1 and 10" MinimumValue="1" MaximumValue="10" ControlToValidate="iQty" />
</div>
<div class="row">
<asp:Label runat="server" CssClass="label"> </asp:Label>
<asp:Button ID="btnReserve" Text="Confirm Reservation" CommandName="Reserve" runat="server" />
</div>
</asp:Panel>
</ItemTemplate>
</asp:FormView>
OriginalL'auteur CJM | 2009-10-21
Vous devez vous connecter pour publier un commentaire.
Pour votre deuxième question, FindControl renvoie un générique de Contrôle, et doit être converti dans le type spécifique de contrôle afin d'obtenir l'accès aux propriétés de ce type de contrôle.
Vous pouvez le faire en une seule ligne, comme ceci:
Concernant votre première question, j'aimerais connaître la réponse aussi.
MODIFIER
Regardé à travers quelques autres StackOverflow réponses (plus précisément cette une et cette une). Comme les contrôles dans le FormView template ne pas exister jusqu'à ce que le modèle est le modèle actif, vous ne pouvez pas directement référence dans le code derrière. Ainsi, vous devez utiliser FindControl lors d'un événement approprié pour accéder aux commandes.
OriginalL'auteur Jason Berkan
Hmm, même dans le FormView modèles, je ne pense pas que FindControl va fonctionner de manière fiable, en général, je ne utiliser que les droites HTML rendus des contrôles, ne pas ASP.net générés.
Je suis assez sûr que le contrôle basé sur un modèle devrait être disponible dans le Serveur de code côté (c'est à dire. txtEmail.texte) si non, vérifier le modèle de
Récursive FindControl est également assez exigeant sur le Serveur et potentiellement peu fiables.
C'est bizarre, as-tu regarder dans le code source pour voir le nom de la commande, curieux de savoir pourquoi le Serveur ne serait pas en mesure de reconnaître... je ne sais pas pourquoi les commandes ne peuvent pas être directement accessible, le FormView est tout simplement un modèle pour un seul enregistrement, si je ne me trompe pas, et en déclarant chaque contrôle comme un asp.net le contrôle ne doit pas se comporter différemment de toute autre déclaration. Je vais vous avouer que je n'ai jamais eu accès à partir de l'intérieur d'un FormView dans le code...
Ahh, il suffit de lire le post ci-dessus - bon à savoir!
OriginalL'auteur Mark Kadlec
Vous devez utiliser récursive méthode FindControl afin d'accéder aux éléments à l'intérieur du contrôle FormView. Il existe de nombreuses implémentations disponibles et l'un d'eux est en lien ci-dessous:
http://www.highoncoding.com/Articles/606_Creating_a_BetterFindControl_and_MuchBetterFindControl.aspx
Salut, Vous pouvez utiliser l'un des gratuit traducteur en ligne outils: developerfusion.com/tools/convert/csharp-to-vb
Bien que je n'en avais pas besoin dans ce cas, j'ai converti le code mentionné dans cet article et il semble bien fonctionner. Merci.
OriginalL'auteur azamsharp