用datagrid梆定数据,然后加入按钮列,删除,
写入删除方法,点删除以后提示定的参数已超出有效值的范围。参数名: index 
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.ArgumentOutOfRangeException: 指定的参数已超出有效值的范围。参数名: index源错误: 
行 317:
行 318:
行 319: mycom.Parameters["@id"].Value=((TextBox)e.Item.Cells[2].Controls[0]).Text; 
如果先点击编辑,然后再电击删除,则没有问题,怎么回事?
因该如何写才正确呢?完整代码private void DataGrid1_DeleteCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{


OleDbConnection a= new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Server.MapPath("../data/cao.mdb")); 

string del="DELETE FROM dinggou WHERE n_id=@id";

OleDbCommand mycom=new OleDbCommand(del,a);
mycom.Parameters.Add(new OleDbParameter("@id",OleDbType.VarChar));
mycom.Parameters["@id"].Value=((TextBox)e.Item.Cells[2].Controls[0]).Text;


mycom.Connection.Open(); mycom.ExecuteNonQuery();

DataGrid1.EditItemIndex=-1; mycom.Connection.Close(); Boolean aa = SortOrder;
if(aa==true)
{
//OleDbConnection a= new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Server.MapPath("../data/cao.mdb")); 
OleDbDataAdapter da=new OleDbDataAdapter("SELECT * FROM dinggou where n_startdata='"+TextBox1.Text+"'",a);
a.Open();
OleDbCommandBuilder bu=new OleDbCommandBuilder(da);
DataSet ds=new DataSet();
da.FillSchema(ds,SchemaType.Mapped);
da.Fill(ds);
DataGrid1.DataSource=ds;
DataGrid1.DataBind();
a.Close();

}
//需要绑定什么数据
else
{

//OleDbConnection a= new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Server.MapPath("../data/cao.mdb")); 
OleDbDataAdapter da=new OleDbDataAdapter("SELECT * FROM dinggou where n_title='"+DropDownList1.SelectedValue+"'",a);
a.Open();
OleDbCommandBuilder bu=new OleDbCommandBuilder(da);
DataSet ds=new DataSet();
da.FillSchema(ds,SchemaType.Mapped);
da.Fill(ds);
DataGrid1.DataSource=ds;
DataGrid1.DataBind();
a.Close();

}
}

//拿到viewstate中的string值,然后转化成boolen类型的
public bool SortOrder
{
get
{
if (ViewState["SortOrder"] != null)
{
return (bool)ViewState["SortOrder"];

}
else
{
ViewState["SortOrder"] = false;
return false;
}
}
set
{
ViewState["SortOrder"] = value;
}
}


}

解决方案 »

  1.   

    一个删除的例子:
    注意:DataKeyField=的用法
    =====页面=====<asp:DataGrid id="DataGrid1" runat="server" AutoGenerateColumns="False" DataKeyField="DoubleKey"> 
                    <Columns> 
                        <asp:BoundColumn DataField="item" HeaderText="item"></asp:BoundColumn> 
                        <asp:ButtonColumn CommandName="del" Text="删除"></asp:ButtonColumn> 
                    </Columns> 
                </asp:DataGrid> ====绑定========private void SetBind() 
            { 
                SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]); 
                SqlDataAdapter da=new SqlDataAdapter("select * from doublekey",conn); 
                DataSet ds=new DataSet(); 
                da.Fill(ds); 
                DataTable dt=ds.Tables[0]; 
                DataColumn dc=new DataColumn("DoubleKey",typeof(string),"key1+'#'+key2"); 
                dt.Columns.Add(dc); 
                this.DataGrid1.DataSource=dt; 
                this.DataGrid1.DataBind(); 
            } =====删除==== private void DataGrid1_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e) 
            { 
                if(e.CommandName=="del") 
                { 
                    SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]);  
                    SqlCommand comm=new SqlCommand("delete from doublekey where key1=@key1 and key2=@key2",conn);  
                    SqlParameter parm1=new SqlParameter("@key1",SqlDbType.Int); 
                    SqlParameter parm2=new SqlParameter("@key2",SqlDbType.Int);  
                    string [] keys=this.DataGrid1.DataKeys[e.Item.ItemIndex].ToString().Split('#'); 
                    parm1.Value=keys[0]; 
                    parm2.Value=keys[1]; 
                    comm.Parameters.Add(parm1); 
                    comm.Parameters.Add(parm2);  
                    conn.Open();  
                    comm.ExecuteNonQuery();  
                    conn.Close();  
                    SetBind();  
                } 
            } 
      

  2.   

    好麻烦哦,如果不用DataKeyField,怎么做呢?
      

  3.   

    删除时用的主键ID,一般都是通过DataKeyField来取得的。
    =((TextBox)e.Item.Cells[2].Controls[0]).Text
    你刚才这样写,是会出错的,因为点删除时,还没有DataGrid还没有生成TextBox。
      

  4.   

    哦,对了,对了,是不是要给那一个字段加上datakeyfield
    如何写呢?
      

  5.   

    我在datagrid中指定了datakeyfile字段
    然后,在后面用String aa=DataGrid1.DataKeyField[(int)e.Item.ItemIndex].ToString();
    Response.Write(aa);
    拿当前行的序号,拿不到?啊,总是n
      

  6.   

    楼主是不是把TextBox放到了编辑模板里了,所以在编辑状态下才有textbox啊
      

  7.   

    为什么不用TextBox aa=(TextBox)e.Item.Findcontrol("TextBox")来处理呢