DataTable的AcceptChanges()和RejectChanges()方法介绍并实现DataGridView数据增、删、改
一、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数据增、删、改的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持猪先飞。
原文出处:https://www.cnblogs.com/dotnet261010/p/6681841.html
相关文章
- 这篇文章主要介绍了C# 遍历datatable字段名和value的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-19
- 将List类型转换成DataTable的通用方法,大家参考使用吧...2020-06-25
- 这篇文章主要介绍了C#实现3步手动建DataGridView的方法,实例分析了C#实现手动创建DataGridView的原理与技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了C#获取变更过的DataTable记录的实现方法,对初学者很有学习借鉴价值,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了C#从DataTable获取数据的方法,涉及C#操作DataTable的相关技巧,需要的朋友可以参考下...2020-06-25
- DataTable用于在.net项目中,用于缓存数据,DataTable表示内存中数据的一个表,在.net项目中运用C#将DataTable转化为CSV文件,接下来通过本文给大家提供一个通用的方法,感兴趣的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了C#中DataGridView动态添加行及添加列的方法,涉及C#中DataGridView针对行与列动态操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了C# DataTable常见用法,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下...2020-11-03
C#中datagridview使用tooltip控件显示单元格内容的方法
这篇文章主要介绍了C#中datagridview使用tooltip控件显示单元格内容的方法,实例分析了C#控件的相关使用技巧,需要的朋友可以参考下...2020-06-25- 如果你的实体类与数据库表是完全一致的。上代码:...2020-06-25
- 有时候我们从数据库获取的数据量太大,而我们不需要一次性显示那么多的时候,我们就要对数据进行分页处理了,让每页显示不同的数据。...2020-06-25
- 这篇文章主要介绍了获取DataTable选择第一行某一列值,需要的朋友可以参考下...2021-09-22
- 这篇文章主要介绍了C#实现DataTable转换成IList的方法,涉及C#针对DataTable操作的相关技巧,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了C#编程实现DataTable添加行的方法,结合两个实例形式分析了C#操作DataTable实现动态添加行的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了C#中DataTable排序、检索、合并等操作实例,其中详细介绍了DataTable.Select的一些注意问题和使用技巧等,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了C# Datatable的几种用法小结,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-19
- 这篇文章主要介绍了C#中DataGridView常用操作,以实例形式总结了DataGridView绑定下拉列表、设置默认值、判断复选框是否选中等技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 这个例子的功能是c#读取excel文件,大家可以参考使用...2020-06-25
实现DataGridView控件中CheckBox列的使用实例
最近做WindowsForms程序,使用DataGridView控件时,加了一列做选择用,发现CheckBox不能选中。搜索后,要实现DataGridView的CellContentClick事件,将代码贴一下...2021-09-22- 这篇文章主要介绍了c#中datagridview处理非绑定列的方法,实例分析了C#中datagridview的使用技巧,需要的朋友可以参考下...2020-06-25