DataTable的AcceptChanges()和RejectChanges()方法介紹并實(shí)現(xiàn)DataGridView數(shù)據(jù)增、刪、改
一、DataTable.AcceptChanges()方法
提交自上次調(diào)用AcceptChanges()方法以來對該表進(jìn)行的所有更改。調(diào)用AcceptChanges()時(shí),任何扔處于編輯模式的DataRow對象將成功結(jié)束其編輯。DataRowState也會(huì)隨之更改:所有狀態(tài)為Added何Modified的行的狀態(tài)都變?yōu)閁nchanged;狀態(tài)為Deleted的行則被移除。
在嘗試使用DbDataAdapter.Update方法更新DataSet之后,通常會(huì)對DataTable調(diào)用AcceptChanges方法。
二、DataTable.RejectChanges()方法
回滾自該表加載以來或上次調(diào)用AcceptChanges()以來對該表進(jìn)行的所有更改。調(diào)用RejectChanges時(shí),任何扔處于編輯模式的DataRow對象將取消其編輯。新行被移除。DataRowState設(shè)置為Modified或Deleted的行返回到其初始狀態(tài)。
使用Delete()方法后,RowState變成“Deleted”狀態(tài)。在您調(diào)用AcceptChanges之前,它一直保持“Deleted”狀態(tài)??赏ㄟ^調(diào)用RejectChanges取消刪除行。
用于從DataTable對象中刪除DataRow對象的方法有兩種:DataRowCollection對象的Remove()方法和DataRow對象的Delete()方法。Rwmove()方法從DataRowCollection中刪除DataRow,而Delete()方法只是將行的狀態(tài)標(biāo)記為刪除,當(dāng)應(yīng)用程序調(diào)用AcceptChanges()方法時(shí),才會(huì)發(fā)生實(shí)際的刪除。通過使用Delete()方法,您可以在實(shí)際刪除之前先以編程的方式檢查哪些行標(biāo)記為刪除。
在將 DataSet 或 DataTable 與 DataAdapter 和關(guān)系型數(shù)據(jù)源一起使用時(shí),用 DataRow 的 Delete 方法移除行。Delete 方法只是在 DataSet 或 DataTable 中將行標(biāo)記為 Deleted,而不會(huì)移除它。而 DataAdapter 在遇到標(biāo)記為 Deleted 的行時(shí),會(huì)執(zhí)行其 DeleteCommand 方法以在數(shù)據(jù)源中刪除該行。然后,就可以用 AcceptChanges 方法永久移除該行。如果使用 Remove 刪除該行,則該行將從表中完全移除,但 DataAdapter 不會(huì)在數(shù)據(jù)源中刪除該行。
三、項(xiàng)目示例
1、界面設(shè)計(jì)

2、代碼實(shí)現(xiàn)
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();
//填充數(shù)據(jù)
adapter.Fill(dsDgv);
this.dgv_Demo.DataSource = dsDgv.Tables[0];
//不顯示最后的空行
this.dgv_Demo.AllowUserToAddRows = false;
// 設(shè)置第一列只讀
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();
//產(chǎn)生與表Users結(jié)構(gòu)相同的空表
DataTable dtAdd = GetEmptyTable();
DataTable dtEdit = GetEmptyTable();
DataTable dtDel = GetEmptyTable();
//根據(jù)DataRowState的狀態(tài)獲取新增、修改、刪除的表數(shù)據(jù)
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);
}
//保存數(shù)據(jù)
if (SaveUser(dsUsers))
{
MessageBox.Show("保存成功!");
//重新加載數(shù)據(jù)
Initdgv();
}
else
{
MessageBox.Show("保存失敗!");
}
}
/// <summary>
/// 根據(jù)表結(jié)構(gòu)產(chǎn)生空表
/// </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>
/// 保存數(shù)據(jù)
/// </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>
/// 數(shù)據(jù)庫增加
/// </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>
/// 數(shù)據(jù)庫刪除
/// </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>
/// 數(shù)據(jù)庫修改
/// </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>
/// 數(shù)據(jù)庫執(zhí)行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("請先選擇要?jiǎng)h除的行");
}
else
{
foreach(DataGridViewRow dr in this.dgv_Demo.SelectedRows)
{
//只是刪除DataGridView中顯示的數(shù)據(jù),并沒有刪除數(shù)據(jù)庫中的數(shù)據(jù)
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沒有綁定數(shù)據(jù)時(shí)才可以使用Add()方法增加空行
this.dgv_Demo.Rows.Add();
}
private void FrmMain_Load(object sender, EventArgs e)
{
this.dgv_Demo.AllowUserToAddRows = false;
}
}
}到此這篇關(guān)于DataTable的AcceptChanges()和RejectChanges()方法介紹并實(shí)現(xiàn)DataGridView數(shù)據(jù)增、刪、改的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于C#數(shù)強(qiáng)轉(zhuǎn)會(huì)不會(huì)拋出異常詳解
這篇文章主要給大家介紹了關(guān)于C#數(shù)強(qiáng)轉(zhuǎn)會(huì)不會(huì)拋出異常的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04
基于C#實(shí)現(xiàn)自定義計(jì)算的Excel數(shù)據(jù)透視表
數(shù)據(jù)透視表(Pivot?Table)是一種數(shù)據(jù)分析工具,通常用于對大量數(shù)據(jù)進(jìn)行匯總、分析和展示,本文主要介紹了C#實(shí)現(xiàn)自定義計(jì)算的Excel數(shù)據(jù)透視表的相關(guān)知識(shí),感興趣的可以了解下2023-12-12
c# 給button添加不規(guī)則的圖片以及用pictureBox替代button響應(yīng)點(diǎn)擊事件的方法
這篇文章介紹了c# 給button添加不規(guī)則的圖片以及用pictureBox替代button響應(yīng)點(diǎn)擊事件的方法,有需要的朋友可以參考一下2013-09-09
WinForm實(shí)現(xiàn)讀取Resource中文件的方法
這篇文章主要介紹了WinForm實(shí)現(xiàn)讀取Resource中文件的方法,很實(shí)用的一個(gè)功能,需要的朋友可以參考下2014-08-08

