DataTable的AcceptChanges()和RejectChanges()方法介绍并实现DataGridView数据增、删、改
作者:.NET开发菜鸟
一、DataTable.AcceptChanges()方法
提交自上次调用AcceptChanges()方法以来对该表进行的所有更改。调用AcceptChanges()时,任何扔处于编辑模式的DataRow对象将成功结束其编辑。DataRowState也会随之更改:所有状态为Added何Modified的行的状态都变为Unchanged;状态为Deleted的行则被移除。
在尝试使用DbDataAdapter.Update方法更新DataSet之后,通常会对DataTable调用AcceptChanges方法。
二、DataTable.RejectChanges()方法
回滚自该表加载以来或上次调用AcceptChanges()以来对该表进行的所有更改。调用RejectChanges时,任何扔处于编辑模式的DataRow对象将取消其编辑。新行被移除。DataRowState设置为Modified或Deleted的行返回到其初始状态。
使用Delete()方法后,RowState变成“Deleted”状态。在您调用AcceptChanges之前,它一直保持“Deleted”状态。可通过调用RejectChanges取消删除行。
用于从DataTable对象中删除DataRow对象的方法有两种:DataRowCollection对象的Remove()方法和DataRow对象的Delete()方法。Rwmove()方法从DataRowCollection中删除DataRow,而Delete()方法只是将行的状态标记为删除,当应用程序调用AcceptChanges()方法时,才会发生实际的删除。通过使用Delete()方法,您可以在实际删除之前先以编程的方式检查哪些行标记为删除。
在将 DataSet 或 DataTable 与 DataAdapter 和关系型数据源一起使用时,用 DataRow 的 Delete 方法移除行。Delete 方法只是在 DataSet 或 DataTable 中将行标记为 Deleted,而不会移除它。而 DataAdapter 在遇到标记为 Deleted 的行时,会执行其 DeleteCommand 方法以在数据源中删除该行。然后,就可以用 AcceptChanges 方法永久移除该行。如果使用 Remove 删除该行,则该行将从表中完全移除,但 DataAdapter 不会在数据源中删除该行。
三、项目示例
1、界面设计
2、代码实现
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Data; using System.Data.SqlClient; using System.Configuration; namespace DataRowStateDemo { public partial class FrmMain : Form { public FrmMain() { InitializeComponent(); } //连接字符串 string strConn = ConfigurationManager.ConnectionStrings["DbConn"].ConnectionString; /// <summary> /// 加载 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btn_LoadData_Click(object sender, EventArgs e) { Initdgv(); this.btn_Add.Visible = false; } /// <summary> /// 初始化DataGridView /// </summary> private void Initdgv() { SqlConnection conn = new SqlConnection(strConn); string strSQL = "select * from Users"; SqlCommand cmd = new SqlCommand(strSQL, conn); SqlDataAdapter adapter = new SqlDataAdapter(cmd); DataSet dsDgv = new System.Data.DataSet(); try { conn.Open(); //填充数据 adapter.Fill(dsDgv); this.dgv_Demo.DataSource = dsDgv.Tables[0]; //不显示最后的空行 this.dgv_Demo.AllowUserToAddRows = false; // 设置第一列只读 this.dgv_Demo.Columns[0].ReadOnly = true; } catch (Exception ex) { } finally { conn.Close(); } } /// <summary> /// 编辑 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btn_Edit_Click(object sender, EventArgs e) { this.dgv_Demo.AllowUserToAddRows = true; } /// <summary> /// 保存 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btn_Save_Click(object sender, EventArgs e) { DataTable dtCopy = this.dgv_Demo.DataSource as DataTable; DataSet dsUsers = new DataSet(); //产生与表Users结构相同的空表 DataTable dtAdd = GetEmptyTable(); DataTable dtEdit = GetEmptyTable(); DataTable dtDel = GetEmptyTable(); //根据DataRowState的状态获取新增、修改、删除的表数据 dtAdd = dtCopy.GetChanges(DataRowState.Added); dtEdit = dtCopy.GetChanges(DataRowState.Modified); dtDel = dtCopy.GetChanges(DataRowState.Deleted); //新增 if (dtAdd != null) { dtAdd.TableName = "Added"; dsUsers.Tables.Add(dtAdd); } //修改 if (dtEdit != null) { dtEdit.TableName = "Edit"; dsUsers.Tables.Add(dtEdit); } //删除 if (dtDel != null) { dtDel.TableName = "Del"; dtDel.RejectChanges(); dsUsers.Tables.Add(dtDel); } //保存数据 if (SaveUser(dsUsers)) { MessageBox.Show("保存成功!"); //重新加载数据 Initdgv(); } else { MessageBox.Show("保存失败!"); } } /// <summary> /// 根据表结构产生空表 /// </summary> /// <returns></returns> private DataTable GetEmptyTable() { DataTable dtTable = new DataTable("Users"); //使用集合初始化器添加列 dtTable.Columns.AddRange(new DataColumn[]{ new DataColumn("UserID",typeof(Int32)), new DataColumn("UserName",typeof(string)), new DataColumn("Password",typeof(string)), new DataColumn("Sex",typeof(Char)), new DataColumn("Birthday",typeof(DateTime)) }); return dtTable; } /// <summary> /// 保存数据 /// </summary> /// <param name="ds"></param> /// <returns></returns> private bool SaveUser(DataSet ds) { bool tf = false; //新增 if (ds.Tables["Added"] != null) { foreach (DataRow dr in ds.Tables["Added"].Rows) { tf= InsertUser(dr); } } //修改 if (ds.Tables["Edit"] != null) { foreach (DataRow dr in ds.Tables["Edit"].Rows) { tf = UpdateUser(dr); } } //删除 if (ds.Tables["Del"] != null) { foreach (DataRow dr in ds.Tables["Del"].Rows) { tf = DeleteUser(dr); } } return tf; } /// <summary> /// 数据库增加 /// </summary> /// <param name="drDataRow"></param> /// <returns></returns> private bool InsertUser(DataRow drDataRow) { string strSQL = string.Format(@"insert into users values('{0}','{1}','{2}','{3}')", drDataRow["UserName"].ToString(), drDataRow["Password"].ToString(), drDataRow["Sex"].ToString(), drDataRow["Birthday"].ToString()); return ExecuteSQL(strSQL); } /// <summary> /// 数据库删除 /// </summary> /// <param name="drDataRow"></param> /// <returns></returns> private bool DeleteUser(DataRow drDataRow) { string strSQL = string.Format("delete from users where UserID='{0}'", Convert.ToInt32(drDataRow["UserID"].ToString())); return ExecuteSQL(strSQL); } /// <summary> /// 数据库修改 /// </summary> /// <param name="drDataRow"></param> /// <returns></returns> private bool UpdateUser(DataRow drDataRow) { string strSQL = string.Format("update users set UserName='{0}',Password='{1}',Sex='{2}',Birthday='{3}' where UserID='{4}'", drDataRow["UserName"].ToString(), drDataRow["Password"].ToString(), drDataRow["Sex"].ToString(), drDataRow["Birthday"].ToString(), Convert.ToInt32(drDataRow["UserID"].ToString())); return ExecuteSQL(strSQL); } /// <summary> /// 数据库执行SQL语句 /// </summary> /// <param name="strSQL"></param> /// <returns></returns> private bool ExecuteSQL(string strSQL) { bool tfResult = false; SqlConnection conn = new SqlConnection(strConn); SqlCommand cmd = new SqlCommand(strSQL, conn); try { conn.Open(); tfResult= cmd.ExecuteNonQuery().Equals(1); } catch (Exception ex) { } finally { conn.Close(); } return tfResult; } /// <summary> /// 删除 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btn_Del_Click(object sender, EventArgs e) { if (this.dgv_Demo.SelectedRows.Count <= 0) { MessageBox.Show("请先选择要删除的行"); } else { foreach(DataGridViewRow dr in this.dgv_Demo.SelectedRows) { //只是删除DataGridView中显示的数据,并没有删除数据库中的数据 this.dgv_Demo.Rows.Remove(dr); } } } /// <summary> /// 增加空行 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btn_Add_Click(object sender, EventArgs e) { //DataGridView没有绑定数据时才可以使用Add()方法增加空行 this.dgv_Demo.Rows.Add(); } private void FrmMain_Load(object sender, EventArgs e) { this.dgv_Demo.AllowUserToAddRows = false; } } }
到此这篇关于DataTable的AcceptChanges()和RejectChanges()方法介绍并实现DataGridView数据增、删、改的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。