删除 DataSet 数据时的问题:
―――――――――――――――――――――――――――――――――――――――――――――――
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 TestDelDataset
{
/**////?
????///?WebForm1?的摘要说明。
????///?
public class?WebForm1 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.DataGrid DataGrid1;
protected?SqlDataAdapter?adapter;
protected?SqlConnection?myConnection;
protected?DataSet?ds;
protected?DataTable?dt;
protected?DataRow?dr;
private?void?Page_Load(object?sender,?System.EventArgs?e)
{
?在此处放置用户代码以初始化页面
if(!Page.IsPostBack)
{
BindData();
}
}
private void BindData()
{
myConnection = new SqlConnection("server=localhost;database=Northwind;Trusted_Connection=yes;user id=sa;password=;");
adapter=new SqlDataAdapter("select * from Categories",myConnection);
ds=new DataSet();
adapter.Fill(ds,"Categories");
dt=ds.Tables["Categories"];
this.DataGrid1.DataSource=dt.DefaultView;
this.DataGrid1.DataBind();
ViewState["dt"]=dt;
ViewState["pk"]=dt.PrimaryKey;
}
Web?窗体设计器生成的代码#region?Web?窗体设计器生成的代码
override protected void?OnInit(EventArgs e)
{
//
????????????//?CODEGEN:?该调用是?ASP.NET?Web?窗体设计器所必需的。
????????????//
InitializeComponent();
base.OnInit(e);
}
**////?
????????///?设计器支持所需的方法?-?不要使用代码编辑器修改
????????///?此方法的内容。
????????///?
private void InitializeComponent()
{
this.DataGrid1.DeleteCommand += new?System.Web.UI.WebControls.DataGridCommandEventHandler(this.DataGrid1_Delete);
this.DataGrid1.SelectedIndexChanged += new?System.EventHandler(this.DataGrid1_SelectedIndexChanged);
this.Load += new?System.EventHandler(this.Page_Load);
}
#endregion
public?void?DataGrid1_SelectedIndexChanged(object?sender,?System.EventArgs?e)
{
}
public void DataGrid1_Delete(object sender,DataGridCommandEventArgs e)
{
try
{
DataTable?dt=(DataTable)ViewState["dt"];
dt.PrimaryKey=new DataColumn[]{dt.Columns["CategoryID"]};
int key=(int)this.DataGrid1.DataKeys[(int)e.Item.ItemIndex];
Response.Write("Click "+key.ToString()+"?Column");
//
dr=dt.Rows.Find(key);
if(dr.Equals(""))
Response.Write("null");
else
Response.Write("no?null");
dt.Rows.Remove(dr);
dr.Delete();
dr.AcceptChanges();
DataGrid1.DataSource=dt.DefaultView;
DataGrid1.DataBind();
}
catch(System.NullReferenceException pp){Response.Write(pp.Message);}
catch(System.ArgumentException ae){Response.Write(ae.Message);}
}
}
}
――――――――――――――――――――――――――――――――――――――――――――
由于删除一行的时候没保存状态,所以当再删除一行或后退的时候,原来删除的那一行就又会出现,解决这种问题的方案就是在初始的时候把dataset中的datatable放到VIEWSTATE里,可以起到保存状态的作用,然后再在删除事件里把datatable从VIEWSTATE里取出来进来操作,再调用Remove()即可删除。
―――――――――――――――――――――――――――――――――――――――――――――――
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 TestDelDataset
{
/**////?
????///?WebForm1?的摘要说明。
????///?
public class?WebForm1 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.DataGrid DataGrid1;
protected?SqlDataAdapter?adapter;
protected?SqlConnection?myConnection;
protected?DataSet?ds;
protected?DataTable?dt;
protected?DataRow?dr;
private?void?Page_Load(object?sender,?System.EventArgs?e)
{
?在此处放置用户代码以初始化页面
if(!Page.IsPostBack)
{
BindData();
}
}
private void BindData()
{
myConnection = new SqlConnection("server=localhost;database=Northwind;Trusted_Connection=yes;user id=sa;password=;");
adapter=new SqlDataAdapter("select * from Categories",myConnection);
ds=new DataSet();
adapter.Fill(ds,"Categories");
dt=ds.Tables["Categories"];
this.DataGrid1.DataSource=dt.DefaultView;
this.DataGrid1.DataBind();
ViewState["dt"]=dt;
ViewState["pk"]=dt.PrimaryKey;
}
Web?窗体设计器生成的代码#region?Web?窗体设计器生成的代码
override protected void?OnInit(EventArgs e)
{
//
????????????//?CODEGEN:?该调用是?ASP.NET?Web?窗体设计器所必需的。
????????????//
InitializeComponent();
base.OnInit(e);
}
**////?
????????///?设计器支持所需的方法?-?不要使用代码编辑器修改
????????///?此方法的内容。
????????///?
private void InitializeComponent()
{
this.DataGrid1.DeleteCommand += new?System.Web.UI.WebControls.DataGridCommandEventHandler(this.DataGrid1_Delete);
this.DataGrid1.SelectedIndexChanged += new?System.EventHandler(this.DataGrid1_SelectedIndexChanged);
this.Load += new?System.EventHandler(this.Page_Load);
}
#endregion
public?void?DataGrid1_SelectedIndexChanged(object?sender,?System.EventArgs?e)
{
}
public void DataGrid1_Delete(object sender,DataGridCommandEventArgs e)
{
try
{
DataTable?dt=(DataTable)ViewState["dt"];
dt.PrimaryKey=new DataColumn[]{dt.Columns["CategoryID"]};
int key=(int)this.DataGrid1.DataKeys[(int)e.Item.ItemIndex];
Response.Write("Click "+key.ToString()+"?Column");
//
dr=dt.Rows.Find(key);
if(dr.Equals(""))
Response.Write("null");
else
Response.Write("no?null");
dt.Rows.Remove(dr);
dr.Delete();
dr.AcceptChanges();
DataGrid1.DataSource=dt.DefaultView;
DataGrid1.DataBind();
}
catch(System.NullReferenceException pp){Response.Write(pp.Message);}
catch(System.ArgumentException ae){Response.Write(ae.Message);}
}
}
}
――――――――――――――――――――――――――――――――――――――――――――
由于删除一行的时候没保存状态,所以当再删除一行或后退的时候,原来删除的那一行就又会出现,解决这种问题的方案就是在初始的时候把dataset中的datatable放到VIEWSTATE里,可以起到保存状态的作用,然后再在删除事件里把datatable从VIEWSTATE里取出来进来操作,再调用Remove()即可删除。