索引超出范围。必须为非负值并小于集合大小。参数名: index 说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.ArgumentOutOfRangeException: 索引超出范围。必须为非负值并小于集合大小。参数名: index源错误: 
行 96:  private void DataGrid1_DeleteCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
行 97:  {
行 98:  string str=this.DataGrid1.DataKeys[e.Item.ItemIndex].ToString();
行 99:  int id=Int32.Parse(str);
行 100: string sql = "DELETE FROM PetTable WHERE id=" + id;源文件: c:\inetpub\wwwroot\webapplication1\webform1.aspx.cs    行: 98

解决方案 »

  1.   

    没判断e.Item.ItemTpye的值,要去掉hear和Foot
    加上if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
            string str=this.DataGrid1.DataKeys[e.Item.ItemIndex].ToString();
            int id=Int32.Parse(str);
            string sql = "DELETE FROM PetTable WHERE id=" + id;
    }
      

  2.   

    你如果分页显示DataGrid了话,最好用数据源来取键值,比如
    string ID="";
    if(ViewState["dtlEmail"]!=null)
    {
    this.dtlEmail = ViewState["dtlEmail"] as DataTable;
    }
    if(this.dtlEmail!=null && this.dtlEmail.Rows.Count>e.Item.DataSetIndex)
    ID = this.dtlEmail.Rows[e.Item.DataSetIndex]["EmailID"].ToString();
      

  3.   

    datagrid 里有一个dataKeyfild属性,你把这个值写成你的id的名字.就ok了
      

  4.   

    不好意思是这个datakeyfield是这个属性.
      

  5.   

    asp.net技术交流
    18590648
      

  6.   

    你到底有没有把数据源的主键的值赋给DataGrid的DataKeyField?
    你代码中就一个string str=this.DataGrid1.DataKeys[e.Item.ItemIndex].ToString();用到了数组,断点跟踪一下看看有没有取到值嘛!