我有这个asp.net控件:
<div class="field" style="text-align: center;">
<asp:GridView ID="gvTags" runat="server" AutoGenerateColumns = "false"
OnRowDataBound="OnRowDataBound" OnRowDeleting="OnRowDelete">
<Columns>
<asp:BoundField DataField="tagId" HeaderText="Id" />
<asp:BoundField DataField="name" HeaderText="<%$ Resources:Common, tlblTags %>" />
<asp:CommandField ShowDeleteButton="True" ButtonType="Button" />
</Columns>
</asp:GridView>
</div>
我从数据库中检索的集合中绑定了这样的数据源:
this.gvTags.DataSource = product.Tags;
this.gvTags.DataBind();
在OnRowDataBound
我创建了一个弹出窗口,以便在单击删除按钮时显示,所以代码是这样的:
protected void OnRowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
string item = e.Row.Cells[1].Text;
foreach (Button button in e.Row.Cells[2].Controls.OfType<Button>())
{
if (button.CommandName == "Delete")
{
button.Attributes["onclick"] = "if(!confirm('Do you want to delete " + item + "?')){ return false; };";
}
}
}
}
这工作正常,我可以在浏览器中看到三行,并且所有工作都按预期工作(弹出窗口显示正确的信息等)。但问题是当我接受弹出窗口时,OnRowDelete
事件被触发。
我想用特定的tagId
从数据库中删除一个Tag,所以我需要在当前行获取位置0,所以这是我的代码:
protected void OnRowDelete(object sender, GridViewDeleteEventArgs e)
{
int index = Convert.ToInt32(e.RowIndex);
GridViewRow row = this.gvTags.Rows[index];
long tagId = Convert.ToInt64(row.Cells[0].Text);
/* Remove the tag */
productService.RemoveTag(productId, tagId);
/* Delete the row from gridview */
this.gvTags.DeleteRow(index);
}
我得到的错误就在这一行:GridViewRow row = this.gvTags.Rows[index];
。我得到System.ArgumentOutOfRangeException
,但我不明白为什么。 index
变量采用有效的int值,如0,1 ...
关于我做错了什么的任何想法?感谢。