单击删除按钮时,总是报错。
前台代码为
<%@ Page Title="" Language="C#" MasterPageFile="~/Admin/admin.master" AutoEventWireup="true" CodeFile="ListOfBooks.aspx.cs" Inherits="Admin_ListOfBooks" %><%@ Register assembly="AspNetPager" namespace="Wuqi.Webdiyer" tagprefix="cc1" %><asp:Content ID="Content1" ContentPlaceHolderID="cphAdmin" Runat="Server">   <div style="font-size:small">
    <asp:GridView runat="server" ID="gvBooks" AutoGenerateColumns="False" 
        BackColor="White" BorderColor="#DEDFDE" BorderStyle="None" BorderWidth="1px" 
        CellPadding="4" ForeColor="Black" GridLines="Vertical" Width="98%" 
        OnRowDataBound="gvBooks_RowDataBound" onrowdeleting="gvBooks_RowDeleting">
        <Columns>
           <asp:TemplateField Visible="False">
                <ItemTemplate>
                    <asp:Label ID="lblId" runat="server" Text='<%# Bind("Id") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:BoundField DataField="Title" HeaderText="书名" />
            <asp:BoundField DataField="Author" HeaderText="作者" />
             <asp:TemplateField HeaderText="类别">
                 <ItemTemplate>
                     <asp:Label ID="Label1" runat="server" Text='<%# Eval("Category.Name") %>'></asp:Label>
                 </ItemTemplate>
            </asp:TemplateField>
            <asp:HyperLinkField DataNavigateUrlFields="id" 
                DataNavigateUrlFormatString="BookDetail.aspx?id={0}" Text="详细" />
            <asp:CommandField ShowDeleteButton="True" />
        </Columns>
        <FooterStyle BackColor="#CCCC99" />
        <RowStyle BackColor="#F7F7DE" />
        <SelectedRowStyle BackColor="#CE5D5A" Font-Bold="True" ForeColor="White" />
        <PagerStyle BackColor="#F7F7DE" ForeColor="Black" HorizontalAlign="Right" />
        <HeaderStyle BackColor="#6B696B" Font-Bold="True" ForeColor="White" />
        <AlternatingRowStyle BackColor="White" />
    </asp:GridView>
    &nbsp;&nbsp;&nbsp;
    <cc1:AspNetPager ID="AspNetPager1" runat="server" 
        onpagechanged="AspNetPager1_PageChanged">
    </cc1:AspNetPager>
</div>
</asp:Content>后台代码为
public partial class Admin_ListOfBooks : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if(!IsPostBack)
        {
            this.AspNetPager1.DataBind();
            BindGrid(0);
            AspNetPager1.CurrentPageIndex = 1;
        }
    }    private void BindGrid(int index)
    {
        int indexs=10*(index);
        this.AspNetPager1.RecordCount = BookManager.GetAllBooks().Rows.Count;
        gvBooks.DataSource = BookManager.GetAllBooks(indexs);
        this.gvBooks.DataBind();
    }
    protected void gvBooks_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if(e.Row.RowType==DataControlRowType.DataRow)
        {
            e.Row.Attributes.Add("onmouseover", "currentcolor=this.style.backgroundColor;this.style.backgroundColor='#6699ff'");
            e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor=currentcolor");
            e.Row.Cells[5].Attributes.Add("onclick", "return confirm('确认删除吗?')");
        }
    }
    protected void AspNetPager1_PageChanged(object src, Wuqi.Webdiyer.PageChangedEventArgs e)
    {
        AspNetPager1.CurrentPageIndex = e.NewPageIndex;
        AspNetPager1.DataBind();
        BindGrid(AspNetPager1.CurrentPageIndex - 1);
    }
    protected void gvBooks_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {
        int Id = int.Parse(gvBooks.DataKeys[e.RowIndex].Value.ToString());//就是这个地方报错
        BookManager.DeleteBookById(Id);
    }
}

解决方案 »

  1.   

    通过gvBooks.DataKeys[e.RowIndex]获取时,需要先指定GridView的DataKeyNames属性,
    如:gvBooks.DataKeyNames=new string[]{"id"};
      

  2.   

    你的GridView  设置DataKeyNames了吗?右键你的GridView  选DataKeyNames属性 里面填上或者如下 <asp:GridView ID="GridView1" runat="server" DataKeyNames="ID">
            </asp:GridView>
      

  3.   

    <asp:GridView runat="server" ID="gvBooks" AutoGenerateColumns="False"  
      BackColor="White" BorderColor="#DEDFDE" BorderStyle="None" BorderWidth="1px"  
      CellPadding="4" ForeColor="Black" GridLines="Vertical" Width="98%"  
      OnRowDataBound="gvBooks_RowDataBound" onrowdeleting="gvBooks_RowDeleting">
    你的GridView里面没有设置DataKeyNames属性值,在以下可以看出,你要用DataKeyNames的是ID。protected void gvBooks_RowDeleting(object sender, GridViewDeleteEventArgs e)
      {
      int Id = int.Parse(gvBooks.DataKeys[e.RowIndex].Value.ToString());//就是这个地方报错
      BookManager.DeleteBookById(Id);
      }