我在以下问题上有疑问:
索引超出范围
我有一个GridView,其中每一行都有一个CheckBox。当我选择一个项目并在一个下拉列表中时,将根据ListItem值执行某些操作。
protected void actionSelect_SelectedIndexChanged(object sender, EventArgs e)
{
GridView gv = Project_GridView;
DropDownList ddl = (DropDownList)sender;
int SelectValue = Convert.ToInt32(ddl.SelectedValue);
UpdateOp(gv, SelectValue);
dl_actionSelect.SelectedIndex = 0;
DataBind();
}
此代码运行:
private void UpdateOp(GridView gv, int SelectValue)
{
foreach (GridViewRow row in gv.Rows)
{
CheckBox check = (CheckBox)row.FindControl("CB_ActionSelect");
if (check.Checked)
{
int rowIndex = row.RowIndex;
DataBind();
if (!(DBNull.Value == gv.DataKeys[row.RowIndex].Value)) //This line throws the exception
{
int original_id = Convert.ToInt32(gv.DataKeys[row.RowIndex].Value);
//Op_Update
uWeb.Data.ProjLines.Op_Update(SelectValue, original_id);
}
}
}
}
遍历行并找到选中的行。但是,当选中多个复选框时,我得到:
ArgumentOutOfRangeException:索引超出范围
奇怪的是,它似乎是可以成功运行的随机量。 1个选中项始终有效,2+有时是随机的,有时却无效。带有控件ID的东西吗?
GridView:
<asp:GridView ID="Project_GridView" runat="server" SkinID="ProdView"
AutoGenerateColumns="False" DataKeyNames="ROWNUMBER" CssClass="gvv"
DataSourceID="Project_ObjectDataSource" OnRowDataBound="Project_GridView_RowDataBound"
AllowSorting="true" Width="100%" AlternatingRowStyle-BackColor="LightGray">
<Columns>
<asp:TemplateField HeaderText="" ItemStyle-Width="4%">
<ItemTemplate>
<asp:CheckBox id="CB_ActionSelect" Text="" runat="server"/>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
答案 0 :(得分:0)
您应该这样得到:
string Id = gv.DataKeys[row.RowIndex %= gv.PageSize][0].ToString();
因为,当GridView的索引从行数开始增加时,就会报告错误。