Pourquoi mon CommandArgument vide?
-
21-09-2019 - |
Question
J'ai une page ASP.Net, qui affiche une liste d'options à l'utilisateur. Quand ils choisissent dans la liste, il fait un retour post et interroge un serveur SQL. Les résultats sont affichés dans un listview sous les options dans un panneau de mise à jour. Ci-dessous un extrait du ItemTemplate:
<asp:LinkButton Text="Save IT" OnCommand="SaveIt" CommandArgument="<%# Container.DataItemIndex %>" runat="server" />
Le DataItemIndex ne semble pas, donc mon CommandArgument est vide. Cependant, l'expéditeur de l'objet est le bouton, ce qui montre l'élément.
Pourquoi l'élément d'index n'apparaît pas dans le CommandArgument?
Serait-ce le poste de retour? Si oui, pourquoi serait-il le poste de retour? Y at-il un moyen de contourner?
Edit: Désolé, de mes tentatives pour le résoudre avant, j'ai posté mauvais code, mais il n'apparaît toujours pas.
Résolution: J'ai trouvé un autre travail autour en ce que l'expéditeur du OnCommand est le bouton de lien, qui a le CommandArgument. Je craie cette question à un problème avec plusieurs postbacks et javascript.
La solution
Vous ne pouvez pas utiliser la syntaxe <%= %>
à l'intérieur des propriétés sur une étiquette avec un attribut runat="server"
. Je suis surpris que le code même de fonctionner. :)
Mise à jour:
Vous voulez probablement utiliser l'événement ItemDataBound sur le répéteur, trouver le linkbutton et définir la propriété CommandArgument.
Pas très élégant, mais voici un échantillon VB.NET.
Private Sub Repeater1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles Repeater1.ItemDataBound
Select Case e.Item.ItemType
Case ListItemType.Item, ListItemType.AlternatingItem
Dim b As LinkButton = e.Item.FindControl("btn")
b.CommandArgument = e.Item.ItemIndex
b.DataBind()
End Select
End Sub
Autres conseils
Vous n'êtes pas le mettre
Vous voulez peut-être
<%# Container.DataItemIndex %>
ou
<%= Container.DataItemIndex %>
:)
Essayez
<asp:LinkButton Text="Save IT" OnCommand="SaveIt" CommandArgument="<%# Container.DataItemIndex %>" runat="server" />
Vous avez été absent du signe "#".
Ce site m'a vraiment aidé à ce problème: http://forums.asp.net/t /1671316.aspx
La question que je courais en était que j'étais passé arguments nuls dans le CommandArgument quand je clique sur le bouton une deuxième fois. Comme le poste explique ci-dessus, c'est parce que CommandArgument est uniquement définie en cas DataBind. Donc, pour résoudre ce problème, inclure un événement DataBind dans la sous page_load
Ex. (VB)
Private Sub BindSelectButtons()
'Purpose: bind the data to the select buttons for commandargument to be used
Dim i As Integer
For i = 0 To gridview1.Rows.Count - 1
gridview1.Rows(i).Cells(8).FindControl("btnID").DataBind()
Next
End Sub
Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
'Rebind select buttons so that the commandargument refreshes
BindSelectButtons()
End Sub
Assurez-vous que l'état d'affichage est activé e.Row.EnableViewState = true;