none
新手求助:GridView中无法删除记录 RRS feed

  • 问题

  •   代码如下:  
    // Delete a record protected void grid_RowDeleting(object sender, GridViewDeleteEventArgs e) { // Get the ID of the record to be deleted string id = grid.DataKeys[e.RowIndex].Value.ToString(); // Execute the delete command bool success = CatalogAccess.DeleteDepartment(id); // Cancel edit mode grid.EditIndex = -1; // Display status message statusLabel.Text = success ? "Delete successful" : "Delete failed"; // Reload the grid BindGrid(); }
    错误提示:
    索引超出范围。必须为非负值并小于集合大小。
    参数名: index

    请问该如何修改代码,谢谢!
    2009年5月31日 12:22

答案

  • 哪行错误的啊。下面是一个完整的例子,取得key字段内容是没有问题的。删除也应该没有问题吧。
    <%@ Page Language="C#" Debug="true" EnableViewState="true" %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
    
    <script runat="server">
    
     
      System.Data.DataView CreateDataSourceByXianhuiMeng()
      {
        System.Data.DataTable dt = new System.Data.DataTable();
        System.Data.DataRow dr;
        dt.Columns.Add(new System.Data.DataColumn("学生班级", typeof(System.String)));
        dt.Columns.Add(new System.Data.DataColumn("学生姓名", typeof(System.String)));
        dt.Columns.Add(new System.Data.DataColumn("语文", typeof(System.Decimal)));
        dt.Columns.Add(new System.Data.DataColumn("数学", typeof(System.Decimal)));
        dt.Columns.Add(new System.Data.DataColumn("英语", typeof(System.Decimal)));
        dt.Columns.Add(new System.Data.DataColumn("计算机", typeof(System.Decimal)));
    
        for (int i = 0; i < 8; i++)
        {
          System.Random rd = new System.Random(Environment.TickCount * i); ;
          dr = dt.NewRow();
          dr[0] = "班级" + i.ToString();
          dr[1] = "【孟子E章】" + i.ToString();
          dr[2] = System.Math.Round(rd.NextDouble() * 100, 2);
          dr[3] = System.Math.Round(rd.NextDouble() * 100, 2);
          dr[4] = System.Math.Round(rd.NextDouble() * 100, 2);
          dr[5] = System.Math.Round(rd.NextDouble() * 100, 2);
          dt.Rows.Add(dr);
        }
        System.Data.DataView dv = new System.Data.DataView(dt);
        return dv;
      }
    
    
      protected void Page_Load(object sender, EventArgs e)
      {
        if (!Page.IsPostBack)
        {
          GridView1.DataSource = CreateDataSourceByXianhuiMeng();
          GridView1.DataBind();
        }
      }
    
      protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
      {
        Response.Write(GridView1.DataKeys[e.RowIndex].Value.ToString());
      }
    </script>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
      <title></title>
    </head>
    <body>
      <form id="form1" runat="server">
      <asp:GridView ID="GridView1" runat="server" AutoGenerateDeleteButton="True" OnRowDeleting="GridView1_RowDeleting"
        DataKeyNames="学生姓名">
      </asp:GridView>
      </form>
    </body>
    </html>
    

    【孟子E章】
    2009年5月31日 13:47
    版主
  • 关键字的列 设置一个键就行了
    蜗牛的长征
    2009年6月2日 3:45

全部回复

  • 你需要在aspx里设置<%@ Page Language="C#" EnableViewState="true" %>
    【孟子E章】
    2009年5月31日 12:54
    版主
  • 还是不行啊
    2009年5月31日 13:06
  • 哪行错误的啊。下面是一个完整的例子,取得key字段内容是没有问题的。删除也应该没有问题吧。
    <%@ Page Language="C#" Debug="true" EnableViewState="true" %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
    
    <script runat="server">
    
     
      System.Data.DataView CreateDataSourceByXianhuiMeng()
      {
        System.Data.DataTable dt = new System.Data.DataTable();
        System.Data.DataRow dr;
        dt.Columns.Add(new System.Data.DataColumn("学生班级", typeof(System.String)));
        dt.Columns.Add(new System.Data.DataColumn("学生姓名", typeof(System.String)));
        dt.Columns.Add(new System.Data.DataColumn("语文", typeof(System.Decimal)));
        dt.Columns.Add(new System.Data.DataColumn("数学", typeof(System.Decimal)));
        dt.Columns.Add(new System.Data.DataColumn("英语", typeof(System.Decimal)));
        dt.Columns.Add(new System.Data.DataColumn("计算机", typeof(System.Decimal)));
    
        for (int i = 0; i < 8; i++)
        {
          System.Random rd = new System.Random(Environment.TickCount * i); ;
          dr = dt.NewRow();
          dr[0] = "班级" + i.ToString();
          dr[1] = "【孟子E章】" + i.ToString();
          dr[2] = System.Math.Round(rd.NextDouble() * 100, 2);
          dr[3] = System.Math.Round(rd.NextDouble() * 100, 2);
          dr[4] = System.Math.Round(rd.NextDouble() * 100, 2);
          dr[5] = System.Math.Round(rd.NextDouble() * 100, 2);
          dt.Rows.Add(dr);
        }
        System.Data.DataView dv = new System.Data.DataView(dt);
        return dv;
      }
    
    
      protected void Page_Load(object sender, EventArgs e)
      {
        if (!Page.IsPostBack)
        {
          GridView1.DataSource = CreateDataSourceByXianhuiMeng();
          GridView1.DataBind();
        }
      }
    
      protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
      {
        Response.Write(GridView1.DataKeys[e.RowIndex].Value.ToString());
      }
    </script>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
      <title></title>
    </head>
    <body>
      <form id="form1" runat="server">
      <asp:GridView ID="GridView1" runat="server" AutoGenerateDeleteButton="True" OnRowDeleting="GridView1_RowDeleting"
        DataKeyNames="学生姓名">
      </asp:GridView>
      </form>
    </body>
    </html>
    

    【孟子E章】
    2009年5月31日 13:47
    版主
  • 关键字的列 设置一个键就行了
    蜗牛的长征
    2009年6月2日 3:45