我正在使用OnRowDataBound自动添加一个链接按钮到我看来是这样的网格视图。我遇到的问题是设置命令参数。
<asp:LinkButton ID = "lnkDelete" Text = "Delete" CommandArgument = '<%# Eval("Value") %>' runat = "server" OnClick = "DeleteFile" />
以下是添加链接的代码。我将命令参数设置为Eval(&#34; Value&#34;),但这不起作用。 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);
}
答案 0 :(得分:1)
RowDataBound
不是动态添加控件的正确事件,因为需要在每次连续回发时重新创建它们。只有在您拨打RowDataBound
时才会触发GridView.DataBind()
。
所以请改用RowCreated
,但在CommandArgument
中分配RowDataBound
值,不要使用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;