<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
提交自上次呼叫AcceptChanges()方法以來對該表進行的所有更改。呼叫AcceptChanges()時,任何扔處於編輯模式的DataRow物件將成功結束其編輯。DataRowState也會隨之更改:所有狀態為Added何Modified的行的狀態都變為Unchanged;狀態為Deleted的行則被移除。
在嘗試使用DbDataAdapter.Update方法更新DataSet之後,通常會對DataTable呼叫AcceptChanges方法。
回滾自該表載入以來或上次呼叫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資料增、刪、改的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45