//数据源是自己写代码绑定的    
protected void Page_Load(object sender, EventArgs e) 
    { 
        if (!IsPostBack) 
        { 
            SqlConnection conn = DB.createConnection(); 
            SqlCommand cmd = new SqlCommand("select experimentDepartID as 实验部门ID,edName as 实验部门名称 from experimentDepart      order by experimentDepartID", conn); 
            conn.Open(); 
            SqlDataReader sdr = cmd.ExecuteReader(); 
            this.gvEdName.DataSource = sdr; 
            this.gvEdName.DataBind(); 
            sdr.Close(); 
            conn.Close(); 
        }     } 
//事件代码 
protected void gvEdName_RowDeleting(object sender, GridViewDeleteEventArgs e) 
    { 
        this.gvEdName.DataKeyNames = new string[] { "experimentDepartID" }; 
        int i = (int)this.gvEdName.DataKeys[e.RowIndex].Values[0]; 
        SqlConnection conn = DB.createConnection(); 
        conn.Open(); 
        SqlCommand cmd = new SqlCommand("delete from experimentDepart where experimentDepartID='" + i + "'", conn); 
        SqlParameter para = new SqlParameter("@i", SqlDbType.TinyInt); 
        para.Value = i; 
        cmd.Parameters.Add(para); 
        cmd.ExecuteNonQuery(); 
        this.gvEdName.DataBind(); 
        conn.Close(); 
    } 
可是一点击删除按钮,就显示 
“索引超出范围。必须为非负值并小于集合大小。 
参数名: index ” 请各位大侠帮忙解决下,是怎么回事。

解决方案 »

  1.   

    把代码放到另一个delete函数中试试先。-
      

  2.   

    int i = (int)this.gvEdName.DataKeys[e.RowIndex].Values[0]; 检查一下这句,e.RowIndex 是不是比 DataKeys 大 1,注意索引的起始地址是不是 0 
      

  3.   

    你取行错了
     应该这样,前提你指定了DataKeyNames 属性值为主键字段
     int i  = Convert.toInt32(gvEdName.DataKeys[e.RowIndex].Value);
      

  4.   


    <asp:GridView ID="gvEdName" runat="server"  AutoGenerateColumns="false" DataKeyNames="experimentDepartID">protected void gvEdName_RowDeleting(object sender, GridViewDeleteEventArgs e) 
        { 
            GridView gv = (GridView)sender;
            int i = int.Parse(gv.DataKeys[e.RowIndex].Value.ToString()); 
            SqlConnection conn = DB.createConnection(); 
            conn.Open(); 
            SqlCommand cmd = new SqlCommand("delete from experimentDepart where experimentDepartID='" + i + "'", conn); 
            SqlParameter para = new SqlParameter("@i", SqlDbType.TinyInt); 
            para.Value = i; 
            cmd.Parameters.Add(para); 
            cmd.ExecuteNonQuery(); 
            this.gvEdName.DataBind(); 
            conn.Close(); 
        } 
      

  5.   

    asp.net 1.*时还没碰过asp.net,不太习惯代码绑定,不过我认为楼上pcb_ghl的方法好像不能解决索引越界问题吧。
    <asp:GridView ID="GridView1" runat="server" onrowdeleting="GridView1_RowDeleting" >
                <Columns>
                    <asp:CommandField ButtonType="Button" HeaderText="Delete" 
                        ShowDeleteButton="True" ShowHeader="True" />
                </Columns>
    </asp:GridView>
    protected void Page_Load(object sender, EventArgs e)
    {
            if (!IsPostBack)
            {
                BindData();
            }
    }
    protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {
            using (SqlConnection conn = DB.createConnection())
            { 
                SqlCommand cmd = conn.CreateCommand();
                cmd.CommandText = "delete from experimentDepart where experimentDepartID=@id";
                cmd.Parameters.AddWithValue("id", GridView1.DataKeys[e.RowIndex].Value);
                conn.Open();
                cmd.ExecuteNonQuery();
                BindData(); //删完后再读取数据库数据绑定到数据库。
            }
    }
    protected void BindData()
    {
            using (SqlConnection conn =  DB.createConnection())
            {
                SqlCommand cmd = conn.CreateCommand();
                cmd.CommandText = "select experimentDepartID as 实验部门ID,edName as 实验部门名称 from experimentDepart order by experimentDepartID";
                conn.Open();
                SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                GridView1.DataSource = reader;
                GridView1.DataKeyNames = new string[] { "实验部门ID" };
                GridView1.DataBind();
                
           }
    }
      

  6.   

    我找到方法了,namhyuk 的做法是可以的,不过还要吧DataKeyNames属性里加上主键字段,就OK啦