我写了如下代码行
在aspx文件中
<asp:TemplateField HeaderText="Is Active">
<ItemTemplate>
<asp:LinkButton ID="lnkEdit" CssClass="colorlnkbtnedit" runat="server" ToolTip="Edit" CommandArgument='<%# DataBinder.Eval (Container.DataItem, "ProductDocument") %>'
CommandName="EditIsActive"><i class=" icon-pencil"></i> </asp:LinkButton>
<asp:Panel ID="pnlIsActEdit" runat="server" Visible="false">
...
...
</asp:Panel>
</ItemTemplate>
</asp:TemplateField>
<。>在.cs文件中
protected void gvProductView_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "Download")
{
...
...
}
else if (e.CommandName == "EditIsActive")
{
int rowID = Convert.ToInt32(e.CommandArgument);
GridViewRow r = gvProductView.Rows[rowID];
Panel p = (Panel)r.FindControl("pnlIsActEdit");
p.Visible = false;
}
}
它无法正常工作!抛出"Index was out of range. Must be non-negative and less than the size of the collection"
GridViewRow r = gvProductView.Rows[rowID];
代码行的错误消息。
答案 0 :(得分:1)
您可以检测CommandArgument
中行的索引,但实际上您正在使用underyling数据源的ProductDocument
初始化它:
CommandArgument='<%# DataBinder.Eval(Container.DataItem, "ProductDocument") %>'
所以这会导致异常。
改为使用:
CommandArgument='<%# Container.DataItemIndex %>'
或
CommandArgument='<%# DataBinder.Eval(Container, "RowIndex") %>'
答案 1 :(得分:0)
只是你有10行,但是如果你的rowID
大于11,那么你就得到了他的错误。
请验证您的行数和rowID
值以解决此问题。
我认为您需要获取当前选定的行。如果是,请参阅this MSDN Document