日期:2014-05-20  浏览次数:21404 次

GridView 索引超出范围。必须为非负值并小于集合大小。参数名: index
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" CellPadding="4" ForeColor="#333333" GridLines="Vertical" OnSelectedIndexChanging="GridView1_SelectedIndexChanging" DataKeyNames="Rbbid">
  <Columns>
  <asp:BoundField DataField="rq" HeaderText="日期" />
  <asp:BoundField DataField="cm" HeaderText="船名" />
  <asp:BoundField DataField="ch" HeaderText="车号" />
  <asp:CommandField InsertVisible="False" ShowCancelButton="False" ShowSelectButton="True" />
  </Columns>
  <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
  <RowStyle BackColor="#EFF3FB" />
  <EditRowStyle BackColor="#2461BF" />
  <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
  <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
  <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
  <AlternatingRowStyle BackColor="White" />
  </asp:GridView>


  protected void Page_Load(object sender, EventArgs e)
  {
  Bind();
  }

  public void Bind()
  {
  SqlConnection con = new SqlConnection(ConfigurationManager.AppSettings["Connection"]);
  con.Open();
  string sql = "select * from t_rbb";
  SqlDataAdapter da = new SqlDataAdapter(sql, con);
  DataSet ds = new DataSet();
  da.Fill(ds);
  GridView1.DataSource = ds;
  GridView1.DataBind();
  con.Close();
  } 
  protected void GridView1_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
  {
  string Rbbid = this.GridView1.DataKeys[e.NewSelectedIndex].Value.ToString();
  Response.Redirect("rbbmx.aspx?Rbbid=" + Rbbid + "");
  }

异常详细信息: System.ArgumentOutOfRangeException: 索引超出范围。必须为非负值并小于集合大小。
参数名: index  

这是怎么回事呀。。。大家能告诉我吗?

------解决方案--------------------
调试一下,看是哪句出了问题
------解决方案--------------------
C# code

  protected void Page_Load(object sender, EventArgs e)
  {
   if(!IsPostBack)
  Bind();
  }

  public void Bind()
  {
  SqlConnection con = new SqlConnection(ConfigurationManager.AppSettings["Connection"]);
  con.Open();
  string sql = "select * from t_rbb";
  SqlDataAdapter da = new SqlDataAdapter(sql, con);
  DataSet ds = new DataSet();
  da.Fill(ds);
  GridView1.DataSource = ds; 
  GridView1.DataKeyNames=new string[]{"id"}; //设置主键
  GridView1.DataBind();
  con.Close();
  }  
  protected void GridView1_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
  {
  string Rbbid = this.GridView1.DataKeys[e.NewSelectedIndex].Value.ToString();
  Response.Redirect("rbbmx.aspx?Rbbid=" + Rbbid + "");
  }

------解决方案--------------------
加个判断
if(index>-1)
因为初始化的时候也会执行这个函数GridView1_SelectedIndexChanging
但这时候index是-1,
所有出错
protected void GridView1_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
{
if(NewSelectedIndex>-1)
string Rbbid = this.GridView1.DataKeys[e.NewSelectedIndex].Value.ToString();
Response.Redirect("rbbmx.aspx?Rbbid=" + Rbbid + "");
}