偶在两个页面里都用到了gridview这个控件,一个页能能删除,一个页面总报错,郁闷死我了!
我用的是access作为数据库,表里有两个字段id(自动编号),name(文本)
下面是我出错页的代码。
html代码片段
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" OnRowDeleting="GridView1_RowDeleting">
            <Columns>
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:Label ID="Label1" runat="server" Text=<%#Eval("name") %>></asp:Label>
                        <asp:LinkButton ID="lbtnDel" runat="server" CommandName ="delete">删除</asp:LinkButton>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>页面.cs代码
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.OleDb;public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!this.IsPostBack)
        {
            bind();
        }
    }    protected void bind()
    {
        string connstring = "Provider=Microsoft.Jet.OleDb.4.0;Data Source=" + Server.MapPath("~/DB/db.mdb");
        string sql = "select * from [log_main]";
        OleDbConnection conn = new OleDbConnection(connstring);
        OleDbDataAdapter dr = new OleDbDataAdapter(sql,conn );
        DataSet ds = new DataSet();
        dr.Fill(ds);
        GridView1.DataSource = ds;
        GridView1.DataBind();    }
    protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {
      int id= (int) GridView1.DataKeys[e.RowIndex-1].Value;//点页面上的删除按钮这行报错!
//索引超出范围。必须为非负值并小于集合大小。
//参数名: index
    }
}他总说我的索引超出范围,我高断点看过e.RowIndex是正确的索引呀!要怎么在gridview自定义模板中删除行呀!

解决方案 »

  1.   

    int id= (int) GridView1.DataKeys[e.RowIndex-1].Value
    应该是
    int id= (int) GridView1.DataKeys[e.ItemIndex].ToString()
      

  2.   

    <asp:gridview id="CustomersGridView" 
            datasourceid="CustomersSqlDataSource" 
            autogeneratecolumns="true"
            autogeneratedeletebutton="true"
            datakeynames="CustomerID"
            runat="server">
          </asp:gridview>
         
          <asp:sqldatasource id="CustomersSqlDataSource"  
            selectcommand="Select [CustomerID], [CompanyName], [Address], [City], [PostalCode], [Country] From [Customers]"
            deletecommand="Delete from Customers where CustomerID = @CustomerID"
            connectionstring="<%$ ConnectionStrings:NorthWindConnectionString%>"
            runat="server">
          </asp:sqldatasource>
      

  3.   

    e.RowIndex 是在全部数据里面的索引,
    e.ItemIndex 是在Grid当前绑定页内的索引。
    如果你当前页不是第一页自然会报错
      

  4.   

    http://weekzero.cnblogs.com/articles/401231.html参考其中的删除操作
      

  5.   

    DataKeys[]内估计就没数据!!要不DataKeys[0]会不会错
    ------------解决方法
    给linkbutton加个属性
    <asp:LinkButton CommandArgument='=<%#Eval("id") %>'/>
     int id= int.Parse(e.CommandArgument);
    如果没有这个e.CommandArgument
     int id= int.Parse((LinkButton)e.CommandSource).CommandArgument);
    总之,你在代码中把LinkButton的CommandArgument取出来作为数据表的ID
      

  6.   

    孟老大,偶不想用控件做,想学学自定义模板里要怎么做:(
    sprc_lcl(cool一生) 在RowDeleting事件里e没有ItemIndex,
      

  7.   

    改正:
    <asp:LinkButton CommandArgument='<%#Eval("id") %>'/>
    我认为这个属性很有用,直接传ID值,肯定不会错
      

  8.   

    aspdotnet2005(天中之子、为中原喝采![我想找兼职]) :数据是有的,要不gridview不会显示出删除按钮,DataKeys[0]也会出错,错误相同!
      

  9.   

    我在别一页面也有一个gridview控件,也有删除但这页就不会出错。这是让我最郁闷了。
     protected void gvDiary_RowDeleting(object sender, GridViewDeleteEventArgs e)//删除留言
        {
            int  dataId = (int)gvDiary.DataKeys[e.RowIndex].Value;
            dc.delData(dataId);
            gvDiary.DataSource = dc.View();
            gvDiary.DataBind();
        }
    这个就不会报错
      

  10.   

    DataKeys[0]这个就错了,还说有数据?????
    老孟这个你看了吗?
    <asp:gridview id="CustomersGridView" 
            datasourceid="CustomersSqlDataSource" 
            autogeneratecolumns="true"
            autogeneratedeletebutton="true"
            datakeynames="ID"//这个有吗??
            runat="server">
          </asp:gridview>
    还有这个你也试试:
    <asp:LinkButton CommandArgument='<%#Eval("id") %>'/>
      

  11.   

    sorry, 看错了,以为是datagrid
      

  12.   

    int id= (int) GridView1.DataKeys[e.RowIndex-1].Value;//点页面上的删除按钮这行
    应该是
    int id= (int) GridView1.DataKeys[e.RowIndex].Value;//点页面上的删除按钮这行要不你删除第一行时会报错
      

  13.   

    谢谢楼上的几位。搞半天没有设 datakeynames,结帖!
      

  14.   

    现在的问题是:int id= (int) GridView1.DataKeys[0].Value
    就错!
    我认为在这个DataKeys集合内就没有数据,
    没有设置GridView1的 datakeynames="ID"属性;
    还有用LinkButton的CommandArgument属性直接把当前的ID传过去