Por que meu CommandAgument está vazio?
-
21-09-2019 - |
Pergunta
Eu tenho uma página do ASP.NET, que exibe uma lista de opções para o usuário. Quando eles selecionam na lista, ela faz uma postagem e consulta um servidor SQL. Os resultados são exibidos em uma ListView abaixo das opções em um painel de atualização. Abaixo está um trecho do itemTemplate:
<asp:LinkButton Text="Save IT" OnCommand="SaveIt" CommandArgument="<%# Container.DataItemIndex %>" runat="server" />
O DataitemIndex não aparece, então meu CommandAgument está vazio. No entanto, o remetente do objeto é o botão, que mostra o item.
Por que o item de índice não está aparecendo no CommandAgument?
Poderia ser o post de volta? Se sim, por que seria o post de volta? Existe uma maneira de contornar isso?
EDIT: Desculpe, pelas minhas tentativas de resolvê -lo antes, publiquei código ruim, mas ainda não está aparecendo.
Resolução: Encontrei outro trabalho em que o remetente do OnCommand é o botão Link, que possui o CommandAgument. Vou atingir esse problema para ser um problema com vários postagens e JavaScript.
Solução
Você não pode usar o <%= %>
sintaxe Propriedades internas em uma tag com um runat="server"
atributo. Estou surpreso que o código seja executado. :)
ATUALIZAR:
Você provavelmente deseja usar o evento ItemDatabound no repetidor, encontrar o linkbutton e definir a propriedade CommandArgument.
Não é muito elegante, mas aqui está uma amostra do 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
Outras dicas
Você não está configurando
Você pode querer
<%# Container.DataItemIndex %>
ou
<%= Container.DataItemIndex %>
:)
Tentar
<asp:LinkButton Text="Save IT" OnCommand="SaveIt" CommandArgument="<%# Container.DataItemIndex %>" runat="server" />
Você estava perdendo o sinal "#".
Este site realmente me ajudou com esse problema: http://forums.asp.net/t/1671316.aspx
O problema que encontrei foi que estava sendo aprovado argumentos nulos no CommandAgument quando cliquei no botão pela segunda vez. Como o post acima explica, isso ocorre porque o CommandAgument está definido apenas no evento do banco de dados. Então, para corrigir isso, inclua um evento de banco de dados no sub 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
Verifique se o estado de exibição está ativado e.row.enableViewState = true;