我在DataGrid分页删除操作中老出现如下错误,该怎么办啊??
请高手帮忙啊!
出现错误:索引超出范围。必须为非负值并小于集合大小。参数名: index

解决方案 »

  1.   

    .CS页:using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    using System.Data.SqlClient;
    namespace DataGridTest
    {
    /// <summary>
    /// ZhuCongTable 的摘要说明。
    /// </summary>
    public class ZhuCongTable : System.Web.UI.Page
    {
    protected System.Web.UI.WebControls.DataGrid dgPar;
    protected System.Web.UI.WebControls.DataGrid dgSub;
    protected   String   ConnString   =   "Server=.;Uid=sa;Pwd=;Database=test"; private void Page_Load(object sender, System.EventArgs e)
    {
    if(!IsPostBack)
    {
    this.BindData();
    // this.BindToDataGrid();
    }
    } private   void   BindData()   
    {   
    SqlDataAdapter   adapter   =   new   SqlDataAdapter("select   *   from   Employees",   ConnString);   
    DataTable   dt   =   new   DataTable();   
    adapter.Fill(dt);   
    dgPar.DataSource   =   dt;   
    dgPar.DataBind();   
    }    //   获取子表数据并填充另外一个DataGrid   
    private   void   GetSubDataBind(string   id)   
    {   
    string   subQuery   =   "select   *   from   Orders   where   EmployeeID=@EmployeeID";   
    SqlDataAdapter   adapter   =   new   SqlDataAdapter(subQuery,   ConnString);   
    adapter.SelectCommand.Parameters.Add("@EmployeeID",   SqlDbType.Int);   
    adapter.SelectCommand.Parameters["@EmployeeID"].Value   =   id;   
    DataTable   dt   =   new   DataTable();   
    adapter.Fill(dt);   
    dgSub.DataSource   =   dt;   
    dgSub.DataBind();   
    }    private void BindToDataGrid()
    {
    SqlConnection con=DB.createCon();
    SqlDataAdapter sda=new SqlDataAdapter();
    sda.SelectCommand=new SqlCommand("select * from Orders where   EmployeeID=@EmployeeID", con);
    DataSet ds=new DataSet();
    sda.Fill(ds,"Orders");
    this.dgSub.DataKeyField="OrderID";
    this.dgSub.DataSource=ds.Tables["Orders"];
    this.dgSub.DataBind();
    } #region Web 窗体设计器生成的代码
    override protected void OnInit(EventArgs e)
    {
    //
    // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
    //
    InitializeComponent();
    base.OnInit(e);
    }

    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {    
    this.dgPar.SelectedIndexChanged += new System.EventHandler(this.dgPar_SelectedIndexChanged);
    this.dgSub.PageIndexChanged += new System.Web.UI.WebControls.DataGridPageChangedEventHandler(this.dgSub_PageIndexChanged);
    this.dgSub.CancelCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.dgSub_CancelCommand);
    this.dgSub.EditCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.dgSub_EditCommand);
    this.dgSub.UpdateCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.dgSub_UpdateCommand);
    this.dgSub.DeleteCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.dgSub_DeleteCommand);
    this.dgSub.ItemDataBound += new System.Web.UI.WebControls.DataGridItemEventHandler(this.dgSub_ItemDataBound);
    this.Load += new System.EventHandler(this.Page_Load); }
    #endregion private void dgPar_SelectedIndexChanged(object sender, System.EventArgs e)
    {
    string   id   =   dgPar.Items[dgPar.SelectedIndex].Cells[1].Text;   
    GetSubDataBind(id);
    } private void dgSub_DeleteCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
    //删除对应的列
    string OrderID=this.dgSub.DataKeys[e.Item.ItemIndex].ToString();
    SqlConnection con=DB.createCon();
    SqlCommand cmd=new SqlCommand("delete from Orders where OrderID='"+OrderID+"'",con);
    con.Open();
    cmd.ExecuteNonQuery();
    this.BindToDataGrid();
    } private void dgSub_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
    {
    if(e.Item.ItemType==ListItemType.Item||e.Item.ItemType==ListItemType.AlternatingItem)
    {
    //鼠标悬停产生特殊效果,离开恢复
    e.Item.Attributes.Add("onmouseover","c=this.style.backgroundColor;this.style.backgroundColor='#6699ff'");
    e.Item.Attributes.Add("onmouseout","this.style.backgroundColor=c");
    //取出第5个单元格(Cells[5])的第一个控件(Controls[0])
    ((LinkButton)(e.Item.Cells[5].Controls[0])).Attributes.Add("onclick","return confirm('确认删除!');");                
    }
    } private void dgSub_CancelCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
    this.dgSub.EditItemIndex=-1;
    this.BindToDataGrid();
    } private void dgSub_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
    {
    this.dgSub.CurrentPageIndex=e.NewPageIndex;
    this.BindToDataGrid();
    } private void dgSub_EditCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
    this.dgSub.EditItemIndex=e.Item.ItemIndex;
    this.BindToDataGrid();
    } private void dgSub_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
    string OrderID=this.dgSub.DataKeys[e.Item.ItemIndex].ToString();
    string CustomerID=((TextBox)e.Item.Cells[1].Controls[0]).Text;
    string EmployeeID=((TextBox)e.Item.Cells[2].Controls[0]).Text;
    string OrderDate =((TextBox)e.Item.Cells[3].Controls[0]).Text;
    //错误原因是因为Northwind数据库不允许修改日期类型,如将日期类型改为{0:D},则执行出错!
    SqlConnection con=DB.createCon();
    SqlCommand cmd=new SqlCommand("update Orders set OrderID='"+OrderID+"', CustomerID='"+CustomerID+"',EmployeeID='"+EmployeeID+"',OrderDate='"+OrderDate+"' where OrderID='"+OrderID+"'",con);
    con.Open();
    cmd.ExecuteNonQuery();
    this.dgSub.EditItemIndex=-1;
    this.BindToDataGrid();
    }
    }
    }
      

  2.   

    数据库为:
    create database test
    GO
    use test
    GO
    create table Employees
    (
    EmployeeID int primary key,
    LastName  Nvarchar(20) not null,
    FirstName Nvarchar(10) not null,
    Title Nvarchar(30),
    TitleOfCourtesy Nvarchar(25),
    BirthDate datetime,
    HireDate datetime,
    )
    GO
    insert into Employees values('1','Davolio','Nancy','Sales Representative','Ms.','1948-12-8','1992-5-1')
    insert into Employees values('2','Fuller','Andrew','Vice President, Sale','Dr.','1952-2-19','1992-8-14')
    insert into Employees values('3','Leverling','Janet','Sales Representative','Ms.','1963-8-30','1992-4-1')
    insert into Employees values('4','Peacock','Margaret','Sales Representative','Mrs.','1937-9-19','1993-5-3')
    GO
    create table Orders
    (
    OrderID int primary key ,
    CustomerID nchar(5) not null,
    EmployeeID int not null,
    OrderDate datetime  not null
    )
    GO
    insert into Orders values('1024','VINET','1','1996-7-4')
    insert into Orders values('1234','TOMSP','2','1996-7-4')
    insert into Orders values('2316','HANAR','3','1996-7-4')
    insert into Orders values('5673','OTTIK','4','1996-7-4')
    insert into Orders values('3487','HILAA','2','1996-7-4')
    insert into Orders values('2222','TOMSP','4','1996-7-4')
    insert into Orders values('3333','HILAA','3','1996-7-4')
    insert into Orders values('4444','HANAR','1','1996-7-4')
    insert into Orders values('5555','TOMSP','1','1996-7-4')
    insert into Orders values('6745','HANAR','4','1996-7-4')
    ASPX页:<form id="Form1" method="post" runat="server">
    <FONT face="宋体">父表:<BR>
    </FONT>
    <asp:DataGrid id="dgPar" runat="server" BorderColor="White" BorderWidth="2px" BackColor="White"
    CellPadding="3" GridLines="None" AutoGenerateColumns="False" BorderStyle="Ridge" CellSpacing="1">
    <FooterStyle Height="30px" ForeColor="Black" BackColor="#C6C3C6"></FooterStyle>
    <SelectedItemStyle Font-Bold="True" ForeColor="White" BackColor="#9471DE"></SelectedItemStyle>
    <ItemStyle Height="20px" ForeColor="Black" BackColor="#DEDFDE"></ItemStyle>
    <HeaderStyle Font-Bold="True" Height="30px" ForeColor="#E7E7FF" BackColor="#4A3C8C"></HeaderStyle>
    <Columns>
    <asp:ButtonColumn Text="选择" CommandName="Select"></asp:ButtonColumn>
    <asp:BoundColumn DataField="EmployeeID" HeaderText="EmployeeID"></asp:BoundColumn>
    <asp:BoundColumn DataField="LastName" HeaderText="LastName"></asp:BoundColumn>
    <asp:BoundColumn DataField="FirstName" HeaderText="FirstName"></asp:BoundColumn>
    <asp:BoundColumn DataField="Title" HeaderText="Title"></asp:BoundColumn>
    </Columns>
    <PagerStyle HorizontalAlign="Right" ForeColor="Black" BackColor="#C6C3C6"></PagerStyle>
    </asp:DataGrid>
    <P><FONT face="宋体">子表:</FONT></P>
    <asp:DataGrid id="dgSub" runat="server" BorderColor="White" BorderWidth="2px" BackColor="White"
    CellPadding="3" GridLines="None" BorderStyle="Ridge" AutoGenerateColumns="False" CellSpacing="1">
    <FooterStyle Height="30px" ForeColor="Black" BackColor="#C6C3C6"></FooterStyle>
    <SelectedItemStyle Font-Bold="True" ForeColor="White" BackColor="#9471DE"></SelectedItemStyle>
    <ItemStyle Height="20px" ForeColor="Black" BackColor="#DEDFDE"></ItemStyle>
    <HeaderStyle Font-Bold="True" Height="30px" ForeColor="#E7E7FF" BackColor="#4A3C8C"></HeaderStyle>
    <Columns>
    <asp:BoundColumn DataField="OrderID" HeaderText="OrderID">
    <HeaderStyle Width="100px"></HeaderStyle>
    </asp:BoundColumn>
    <asp:BoundColumn DataField="CustomerID" HeaderText="CustomerID">
    <HeaderStyle Width="100px"></HeaderStyle>
    </asp:BoundColumn>
    <asp:BoundColumn DataField="EmployeeID" HeaderText="EmployeeID">
    <HeaderStyle Width="100px"></HeaderStyle>
    </asp:BoundColumn>
    <asp:BoundColumn DataField="OrderDate" HeaderText="OrderDate">
    <HeaderStyle Width="100px"></HeaderStyle>
    </asp:BoundColumn>
    <asp:EditCommandColumn ButtonType="LinkButton" UpdateText="更新" CancelText="取消" EditText="编辑"></asp:EditCommandColumn>
    <asp:ButtonColumn Text="删除" CommandName="Delete"></asp:ButtonColumn>
    </Columns>
    <PagerStyle HorizontalAlign="Right" ForeColor="Black" BackColor="#C6C3C6"></PagerStyle>
    </asp:DataGrid>
    </form>
      

  3.   

    没有设置DataGrid中的关键字段
      

  4.   

    pagecount要从新计算,删了一条记录集的数据产生了变化,索引就会超出范围
    页码会起变化,我当时是自己写的分页按钮,你可以下个分页的控件!