2017-10-17 7 views
2

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: enter image description here

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é.

enter image description here

Qu'est-ce que j'utilise?

  • Visual Studio 2017
  • .NET Framework 4.6.1
  • 2-Tier WebForms Projet
  • Google Chrome
+0

utilisent des contrôles asp au lieu de html simple. – AsifAli72090

+0

@ 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

+0

votre problème est l'accès à la zone de texte sur l'événement de clic de bouton de sauvegarde? – AsifAli72090

Répondre

1

Pour obtenir le texte de votre zone de texte bouton de sauvegarde cliquez sur utilisez le code ci-dessous:

// get item on where button is clicked 
RepeaterItem item = (RepeaterItem)((Button) sender).NamingContainer; 

// get correct textbox from the item 
TextBox txtQuantity = (TextBox)item.FindControl("quantity"); 

string qtyText = txtQuantity.Text; 

Dans votre troisième approche que la vérification DataItems Vous êtes en train, mais vous devez vérifier sur AlternatingItems aussi:

if (e.ItemType == ListItemType.Item || e.ItemType == ListItemType.AlternatingItem) 
+0

Comme je l'ai mentionné dans mon OP, j'ai plusieurs TextBox dont j'ai besoin pour obtenir le texte. Il y a 1 zone de texte de quantité par produit. L'utilisation de votre code fourni n'obtiendrait que la première zone de texte à afficher. Le bouton "sauvegarder" du deuxième produit doit accéder à la "quantité" du deuxième produit, pas à la "quantité" du premier produit, PS - Désolé pour l'attente, les cours ont recommencé. Je n'ai que 10 minutes avant la prochaine période. – Tyler

+0

si votre zone de texte est à l'intérieur du répéteur alors cela fonctionnera bien car vous avez besoin de plusieurs zones de texte dans le répéteur. – AsifAli72090

+0

Oh ...Ainsi, le RepeaterItem gère essentiellement la définition d'ID dynamiques dans les coulisses. Il semble fonctionner parfaitement bien. Merci! – Tyler