asp.netcommandargument

asp.net set command argument


I am using OnRowDataBound to automatically add a link button to my grid view that looks like this. The problem I am having is setting the command argument.

<asp:LinkButton ID = "lnkDelete" Text = "Delete" CommandArgument = '<%# Eval("Value") %>' runat = "server" OnClick = "DeleteFile" />

Below is the code that adds the links. I set the command argument to Eval("Value") but that doesn't work. Here is a link to the original code that I'm trying to change so it is dynamic.

protected void OnRowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        LinkButton lnkView = new LinkButton();
        lnkView.ID = "lnkDelete";
        lnkView.Text = "Delete";
        lnkView.Click += DeleteFile;
        lnkView.CommandArgument = Eval("Value");
        e.Row.Cells[1].Controls.Add(lnkView);
    }

Solution

  • RowDataBound is not the right event to add controls dynamically because they need to be re-created on every consecutive postback. RowDataBound is triggered only if you call GridView.DataBind().

    So use RowCreated instead, but assign the CommandArgument value in RowDataBound and don't use Eval("Value") but the actual datasource which you get from e.Row.DataItem.

    Something like this should work:

    protected void OnRowCreated(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            LinkButton lnkView = new LinkButton();
            lnkView.ID = "lnkDelete";
            lnkView.Text = "Delete";
            lnkView.Click += DeleteFile;
            e.Row.Cells[1].Controls.Add(lnkView);
        }
    }
    
    protected void OnRowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            LinkButton lnkView = (LinkButton)e.Row.FindControl("lnkDelete");
            var rowView = (DataRowView)e.Row.DataItem;
            lnkView.CommandArgument = rowView.Row.Field<string>("Value");
        }
    }
    

    If this throws an exception at runtime you need to change (DataRowView)e.Row.DataItem to the actual datasource which you can get from the debugger.

    Edit: as commented it is a ListItem and you want to use it's Value property:

    var item = (ListItem) e.Row.DataItem;
    lnkView.CommandArgument = item.Value;