用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;
}
}
}
写入删除方法,点删除以后提示定的参数已超出有效值的范围。参数名: 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;
}
}
}
注意: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();
}
}
=((TextBox)e.Item.Cells[2].Controls[0]).Text
你刚才这样写,是会出错的,因为点删除时,还没有DataGrid还没有生成TextBox。
如何写呢?
然后,在后面用String aa=DataGrid1.DataKeyField[(int)e.Item.ItemIndex].ToString();
Response.Write(aa);
拿当前行的序号,拿不到?啊,总是n