0

我正在使用 OnRowDataBound 自动将链接按钮添加到我的网格视图中,如下所示。我遇到的问题是设置命令参数。

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

下面是添加链接的代码。我将命令参数设置为 Eval("Value") 但这不起作用。这是我尝试更改的原始代码的链接,因此它是动态的。

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);
    }
4

1 回答 1

1

RowDataBound不是动态添加控件的正确事件,因为它们需要在每次连续回发时重新创建。RowDataBound仅当您调用 时才会触发GridView.DataBind()

因此,请RowCreated改用,但分配CommandArgumentRowDataBound而不使用Eval("Value")您从中获得的实际数据源e.Row.DataItem

像这样的东西应该工作:

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");
    }
}

如果这在运行时引发异常,您需要更改(DataRowView)e.Row.DataItem为可以从调试器获取的实际数据源。

编辑:正如评论它是一个ListItem并且你想使用它的Value属性:

var item = (ListItem) e.Row.DataItem;
lnkView.CommandArgument = item.Value;
于 2015-01-27T10:57:50.183 回答