一个非常奇怪的问题:
有一个 GridView1 ,
<asp:GridView ID= "GridView1 " runat= "server " AllowPaging= "True " DataKeyNames= "id,name ">
说明:
页面中有一个 Button1 ,然后, GridView1 的第一个模板列有一个 checkbox ,用来做选中当前行,然后,当我点击 Button1 按钮的时候,激发以下事件,取得此 GridView1 中被 选中的行的值,当我的 GridView 没有设分页的时候,以下一切正常:
protected void Button1_Click(object sender, EventArgs e)
{
this.Label1.Text = " ";
foreach (GridViewRow gvr in GridView1.Rows)
{
CheckBox ch = (CheckBox)gvr.FindControl( "ItemCheckBox ");
if (ch.Checked)
{
this.Label1.Text += " <li> GridView1 您选择的是(键值): " + GridView1.DataKeys[gvr.DataItemIndex].Value.ToString();
}
}
}
可是当我把此 GridView 设置成分页模式以后,只有在第一页,点击 Button1 按钮时,以上事件才可以正常,当翻到第 二页及以后时,以下事件,就出错了:
-------------------------------------------
索引超出范围。必须为非负值并小于集合大小。
参数名: index
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.ArgumentOutOfRangeException: 索引超出范围。必须为非负值并小于集合大小。
参数名: index
--------------------------
然后,IIS 就报出以不这句有错:
this.Label1.Text += " <li> GridView1 您选择的是(键值): " + GridView1.DataKeys[gvr.DataItemIndex].Value.ToString();
------解决方案--------------------------------------------------------
this.Label1.Text += " <li> GridView1 您选择的是(键值): " + GridView1.DataKeys[gvr.DataItemIndex].Value.ToString();
===============================================================================
this.Label1.Text += " <li> GridView1 您选择的是(键值): " + GridView1.DataKeys[gvr.RowIndex].Value.ToString();