PrésentationComment accéder à des contrôles spécifiques dans un répéteur ASP.Net
Je travaille sur un projet d'université où je dois construire un site Web commercial.
Je suis en train de construire une « Gérer Panier » avec la structure suivante:
Ce qui est important pour ma question est les « produits ». Les "produits" sont un répéteur ASP.Net qui utilise uniquement le contrôle ItemTemplate
. Le répéteur est ensuite rempli avec une liste de produits dans le panier d'un utilisateur.
Quel est mon problème?
La zone particulière qui me pose problème est le bouton "Enregistrer". L'utilisateur peut changer la quantité de chaque produit qu'ils veulent; Cependant, ils doivent cliquer sur le bouton "Enregistrer" pour que les informations à accéder à la base de données.
Le problème est d'accéder à la zone de texte correcte dans l'événement onclick de mon bouton Enregistrer.
Comment puis-je accéder à la zone de texte correcte dans tous les événements OnClick de mon bouton Enregistrer?
Qu'est-ce que j'ai essayé?
Je pensais initialement à utiliser la méthode WebControl.FindControl. Bien sûr, le FindControl nécessite un identifiant et j'aurais besoin de différents identifiants pour chaque zone de texte.
Pour le résoudre ce problème d'identité, j'ai essayé ...
... d'abord
Essayé liant le productId à l'ID de zone de texte.
<asp:TextBox ID='quantity<%#Eval("productId") %>' runat="server" TextMode="Number" min="1" Text='<%#Eval("selectedQuantity") %>' max='<%#Eval("availableQuantity") %>' />
J'ai ensuite découvert que ce n'est pas possible; parce que, lors de la définition d'un ID de cette façon, vous devez utiliser "simple ids" (Exemple: "button1"). Je suppose que je pourrais définir l'ID dans le code-behind cependant.
... En second lieu
J'ai alors essayé d'utiliser le OnItemCreated de répéteur événement pour définir dynamiquement l'ID de la zone de texte à « QUANTITY », où X est un ID de produit.
Ce que je ne en est la lie productId dans un attribut WebControl:
<asp:TextBox ID='quantity' productId='<%#Eval("productId") %>' runat="server" TextMode="Number" min="1" Text='<%#Eval("selectedQuantity") %>' max='<%#Eval("availableQuantity") %>' />
Après cela, je puis en utilisant la méthode FindControl()
pour obtenir textboxs avec une carte d'identité de la « quantité ». Après avoir trouvé le TextBox, je prend l'attribut productId et ajoute sa valeur à l'ID TextBox.
protected void productsList_ItemCreated(object sender, RepeaterItemEventArgs e)
{
if(e.Item.ItemType == ListItemType.Item)
{
TextBox quantity = (TextBox)e.Item.FindControl("quantity");
quantity.ID = String.Format("quantity{0}", quantity.Attributes["productId"]);
}
}
J'ai alors découvert que l'attribut productId n'avait pas de valeur; parce que DataBinding n'a pas eu lieu. En d'autres termes, Eval("productId")
n'était pas en cours d'exécution.
enfin ...
Je pris la même approche que celle d'avant avec 1 différence. J'ai utilisé l'événement OnItemDataBound
du répéteur au lieu de l'événement OnItemCreated
.
protected void productsList_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if(e.Item.ItemType == ListItemType.Item)
{
TextBox quantity = (TextBox)e.Item.FindControl("quantity");
quantity.ID = String.Format("quantity{0}", quantity.Attributes["productId"]);
}
}
Ceci a partiellement fonctionné; Cependant, il y avait un problème. Le produit avec le plus grand identifiant de produit a été ignoré. (E.X, si j'avais des produits 4, 32, et 68. L'ID de produit de 68 serait sauté)
Comme vous pouvez le voir dans l'image ci-dessous, nous avons 3 produits. J'ai édité du texte l'image pour indiquer clairement les TextBoxs (comme ils sont rendus).
Les ID présents sont 1, 32 et 34. Si vous regardez l'attribut ID de 1 et 32, vous verrez qu'ils ont "quantité" avec leur ID de produit ajouté.
Regardez maintenant l'attribut ID de 34. L'attribut ID est seulement "quantité".
Maintenant, je suis coincé.
Qu'est-ce que j'utilise?
- Visual Studio 2017
- .NET Framework 4.6.1
- 2-Tier WebForms Projet
- Google Chrome
utilisent des contrôles asp au lieu de html simple. – AsifAli72090
@ Asif.Ali J'utilise les contrôles ASP ... La dernière image dans l'OP est une capture d'écran de la page rendue dans les outils de développement de chrome. – Tyler
votre problème est l'accès à la zone de texte sur l'événement de clic de bouton de sauvegarde? – AsifAli72090