日期:2014-05-18  浏览次数:20447 次

GridView1.DataKeys[gvr.DataItemIndex].Value.ToString()索引超出范围。必须为非负值并小于集合大小
一个非常奇怪的问题:

有一个   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();