網站首頁 編程語言 正文
DataTable的AcceptChanges()和RejectChanges()方法介紹并實現DataGridView數據增、刪、改_C#教程
作者:.NET開發菜鳥 ? 更新時間: 2022-04-29 編程語言一、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; ////// 加載 /// /// /// private void btn_LoadData_Click(object sender, EventArgs e) { Initdgv(); this.btn_Add.Visible = false; } ////// 初始化DataGridView /// 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(); } } ////// 編輯 /// /// /// private void btn_Edit_Click(object sender, EventArgs e) { this.dgv_Demo.AllowUserToAddRows = true; } ////// 保存 /// /// /// 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("保存失敗!"); } } ////// 根據表結構產生空表 /// ///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; } /// /// 保存數據 /// /// ///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; } /// /// 數據庫增加 /// /// ///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); } /// /// 數據庫刪除 /// /// ///private bool DeleteUser(DataRow drDataRow) { string strSQL = string.Format("delete from users where UserID='{0}'", Convert.ToInt32(drDataRow["UserID"].ToString())); return ExecuteSQL(strSQL); } /// /// 數據庫修改 /// /// ///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); } /// /// 數據庫執行SQL語句 /// /// ///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; } /// /// 刪除 /// /// /// 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); } } } ////// 增加空行 /// /// /// 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; } } }
原文鏈接:https://www.cnblogs.com/dotnet261010/p/6681841.html
相關推薦
- 2022-10-04 R語言將變量分組的3種方法實例(含cut函數說明)_R語言
- 2023-05-24 Django獲取前端數據的實現方式_python
- 2023-04-06 python?numpy.linalg.norm函數的使用及說明_python
- 2022-04-30 Python中類變量和實例變量的區別_python
- 2022-04-04 Python?Opencv實現圖片切割處理_python
- 2022-12-24 Python中通過@classmethod?實現多態的示例_python
- 2022-12-09 C++中使用cout以hex格式輸出方式_C 語言
- 2022-07-21 UNION 和 UNION ALL的區別
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支