Question

I have an ASP.Net page, which displays a list of options to the user. When they select from the list, it does a post back and queries a sql server. The results are displayed in a listview below the options in an update panel. Below is a snippet of the ItemTemplate:

<asp:LinkButton Text="Save IT" OnCommand="SaveIt" CommandArgument="<%# Container.DataItemIndex %>" runat="server" />

The DataItemIndex does not appear, so my commandargument is empty. However, the object sender is the button, which shows the item.

Why is the index item not appearing in the CommandArgument?

Could it be the post back? If so, why would it be the post back? Is there a way around it?

Edit: Sorry, from my attempts to solve it before, I posted bad code, but it still isn't appearing.

Resolution: I found another work around in that the sender of the OnCommand is the link button, which has the CommandArgument. I will chalk this issue up to be an issue with multiple postbacks and javascript.

Was it helpful?

Solution

You can't use the <%= %> syntax inside properties on a tag with a runat="server" attribute. I'm surprised the code will even run. :)

UPDATE:

You probably want to use the ItemDataBound event on the repeater, find the linkbutton and set the CommandArgument property.

Not very elegant, but here's a VB.NET sample.

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

OTHER TIPS

You're not setting it

You possibly want

<%# Container.DataItemIndex %>

or

<%= Container.DataItemIndex %>

:)

Try

<asp:LinkButton Text="Save IT" OnCommand="SaveIt" CommandArgument="<%# Container.DataItemIndex %>" runat="server" />

You were missing the "#" sign.

This site really helped me with this problem: http://forums.asp.net/t/1671316.aspx

The issue I ran into was that I was being passed null arguments in the commandargument when I clicked on the button a second time. As the post above explains, this is because commandargument is only set in the databind event. So, to fix this, include a databind event in the page_load sub

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

Make sure View State is enabled e.Row.EnableViewState = true;

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top