DataRowState、AcceptChanges、RejectChanges综合使用示例:实现DataGridView数据的增、删、改

下面的示例中,通过一个程序,演示使用DataRowState、AcceptChanges、RejectChanges,实现DataGridView数据的增、删、改。

一、界面设计

二、代码实现

  1 using System;
  2 using System.Collections.Generic;
  3 using System.ComponentModel;
  4 using System.Data;
  5 using System.Drawing;
  6 using System.Linq;
  7 using System.Text;
  8 using System.Threading.Tasks;
  9 using System.Windows.Forms;
 10 using System.Data;
 11 using System.Data.SqlClient;
 12 using System.Configuration;
 13
 14 namespace DataRowStateDemo
 15 {
 16     public partial class FrmMain : Form
 17     {
 18         public FrmMain()
 19         {
 20             InitializeComponent();
 21         }
 22
 23         //连接字符串
 24         string strConn = ConfigurationManager.ConnectionStrings["DbConn"].ConnectionString;
 25
 26         /// <summary>
 27         /// 加载
 28         /// </summary>
 29         /// <param name="sender"></param>
 30         /// <param name="e"></param>
 31         private void btn_LoadData_Click(object sender, EventArgs e)
 32         {
 33             Initdgv();
 34             this.btn_Add.Visible = false;
 35         }
 36
 37         /// <summary>
 38         /// 初始化DataGridView
 39         /// </summary>
 40         private void Initdgv()
 41         {
 42             SqlConnection conn = new SqlConnection(strConn);
 43             string strSQL = "select * from Users";
 44             SqlCommand cmd = new SqlCommand(strSQL, conn);
 45             SqlDataAdapter adapter = new SqlDataAdapter(cmd);
 46             DataSet dsDgv = new System.Data.DataSet();
 47             try
 48             {
 49                 conn.Open();
 50                 //填充数据
 51                 adapter.Fill(dsDgv);
 52
 53                 this.dgv_Demo.DataSource = dsDgv.Tables[0];
 54                 //不显示最后的空行
 55                 this.dgv_Demo.AllowUserToAddRows = false;
 56                 // 设置第一列只读
 57                 this.dgv_Demo.Columns[0].ReadOnly = true;
 58             }
 59             catch (Exception ex)
 60             { }
 61             finally
 62             {
 63                 conn.Close();
 64             }
 65         }
 66
 67         /// <summary>
 68         /// 编辑
 69         /// </summary>
 70         /// <param name="sender"></param>
 71         /// <param name="e"></param>
 72         private void btn_Edit_Click(object sender, EventArgs e)
 73         {
 74             this.dgv_Demo.AllowUserToAddRows = true;
 75         }
 76
 77         /// <summary>
 78         /// 保存
 79         /// </summary>
 80         /// <param name="sender"></param>
 81         /// <param name="e"></param>
 82         private void btn_Save_Click(object sender, EventArgs e)
 83         {
 84             DataTable dtCopy = this.dgv_Demo.DataSource as DataTable;
 85             DataSet dsUsers = new DataSet();
 86
 87             //产生与表Users结构相同的空表
 88             DataTable dtAdd = GetEmptyTable();
 89             DataTable dtEdit = GetEmptyTable();
 90             DataTable dtDel = GetEmptyTable();
 91
 92             //根据DataRowState的状态获取新增、修改、删除的表数据
 93             dtAdd = dtCopy.GetChanges(DataRowState.Added);
 94             dtEdit = dtCopy.GetChanges(DataRowState.Modified);
 95             dtDel = dtCopy.GetChanges(DataRowState.Deleted);
 96
 97             //新增
 98             if (dtAdd != null)
 99             {
100                 dtAdd.TableName = "Added";
101                 dsUsers.Tables.Add(dtAdd);
102             }
103             //修改
104             if (dtEdit != null)
105             {
106                 dtEdit.TableName = "Edit";
107                 dsUsers.Tables.Add(dtEdit);
108             }
109             //删除
110             if (dtDel != null)
111             {
112                 dtDel.TableName = "Del";
113                 dtDel.RejectChanges();
114                 dsUsers.Tables.Add(dtDel);
115             }
116             //保存数据
117             if (SaveUser(dsUsers))
118             {
119                 MessageBox.Show("保存成功!");
120                 //重新加载数据
121                 Initdgv();
122             }
123             else
124             {
125                 MessageBox.Show("保存失败!");
126             }
127         }
128
129         /// <summary>
130         /// 根据表结构产生空表
131         /// </summary>
132         /// <returns></returns>
133         private DataTable GetEmptyTable()
134         {
135             DataTable dtTable = new DataTable("Users");
136             //使用集合初始化器添加列
137             dtTable.Columns.AddRange(new DataColumn[]{
138                    new DataColumn("UserID",typeof(Int32)),
139                    new DataColumn("UserName",typeof(string)),
140                    new DataColumn("Password",typeof(string)),
141                    new DataColumn("Sex",typeof(Char)),
142                    new DataColumn("Birthday",typeof(DateTime))
143             });
144             return dtTable;
145         }
146
147         /// <summary>
148         /// 保存数据
149         /// </summary>
150         /// <param name="ds"></param>
151         /// <returns></returns>
152         private bool SaveUser(DataSet ds)
153         {
154             bool tf = false;
155             //新增
156             if (ds.Tables["Added"] != null)
157             {
158                 foreach (DataRow dr in ds.Tables["Added"].Rows)
159                 {
160                    tf= InsertUser(dr);
161                 }
162             }
163             //修改
164             if (ds.Tables["Edit"] != null)
165             {
166                 foreach (DataRow dr in ds.Tables["Edit"].Rows)
167                 {
168                     tf = UpdateUser(dr);
169                 }
170             }
171             //删除
172             if (ds.Tables["Del"] != null)
173             {
174                 foreach (DataRow dr in ds.Tables["Del"].Rows)
175                 {
176                     tf = DeleteUser(dr);
177                 }
178             }
179             return tf;
180         }
181
182         /// <summary>
183         /// 数据库增加
184         /// </summary>
185         /// <param name="drDataRow"></param>
186         /// <returns></returns>
187         private bool InsertUser(DataRow drDataRow)
188         {
189             string strSQL = string.Format(@"insert into users values(‘{0}‘,‘{1}‘,‘{2}‘,‘{3}‘)", drDataRow["UserName"].ToString(), drDataRow["Password"].ToString(),                                                 drDataRow["Sex"].ToString(), drDataRow["Birthday"].ToString());
190             return ExecuteSQL(strSQL);
191         }
192
193         /// <summary>
194         /// 数据库删除
195         /// </summary>
196         /// <param name="drDataRow"></param>
197         /// <returns></returns>
198         private bool DeleteUser(DataRow drDataRow)
199         {
200             string strSQL = string.Format("delete from users where UserID=‘{0}‘", Convert.ToInt32(drDataRow["UserID"].ToString()));
201             return ExecuteSQL(strSQL);
202         }
203
204         /// <summary>
205         /// 数据库修改
206         /// </summary>
207         /// <param name="drDataRow"></param>
208         /// <returns></returns>
209         private bool UpdateUser(DataRow drDataRow)
210         {
211             string strSQL = string.Format("update users set UserName=‘{0}‘,Password=‘{1}‘,Sex=‘{2}‘,Birthday=‘{3}‘ where UserID=‘{4}‘",
212                                          drDataRow["UserName"].ToString(), drDataRow["Password"].ToString(), drDataRow["Sex"].ToString(),
213                                          drDataRow["Birthday"].ToString(), Convert.ToInt32(drDataRow["UserID"].ToString()));
214             return ExecuteSQL(strSQL);
215         }
216
217          /// <summary>
218          /// 数据库执行SQL语句
219          /// </summary>
220          /// <param name="strSQL"></param>
221          /// <returns></returns>
222         private bool ExecuteSQL(string strSQL)
223         {
224             bool tfResult = false;
225             SqlConnection conn = new SqlConnection(strConn);
226             SqlCommand cmd = new SqlCommand(strSQL, conn);
227             try
228             {
229                 conn.Open();
230                 tfResult= cmd.ExecuteNonQuery().Equals(1);
231             }
232             catch (Exception ex)
233             { }
234             finally
235             {
236                 conn.Close();
237             }
238
239             return tfResult;
240         }
241
242         /// <summary>
243         /// 删除
244         /// </summary>
245         /// <param name="sender"></param>
246         /// <param name="e"></param>
247         private void btn_Del_Click(object sender, EventArgs e)
248         {
249             if (this.dgv_Demo.SelectedRows.Count <= 0)
250             {
251                 MessageBox.Show("请先选择要删除的行");
252             }
253             else
254             {
255                 foreach(DataGridViewRow dr in this.dgv_Demo.SelectedRows)
256                 {
257                     //只是删除DataGridView中显示的数据,并没有删除数据库中的数据
258                     this.dgv_Demo.Rows.Remove(dr);
259                 }
260
261             }
262         }
263
264         /// <summary>
265         /// 增加空行
266         /// </summary>
267         /// <param name="sender"></param>
268         /// <param name="e"></param>
269         private void btn_Add_Click(object sender, EventArgs e)
270         {
271             //DataGridView没有绑定数据时才可以使用Add()方法增加空行
272             this.dgv_Demo.Rows.Add();
273         }
274
275         private void FrmMain_Load(object sender, EventArgs e)
276         {
277             this.dgv_Demo.AllowUserToAddRows = false;
278         }
279     }
280 }
时间: 2024-10-12 09:10:58

DataRowState、AcceptChanges、RejectChanges综合使用示例:实现DataGridView数据的增、删、改的相关文章

数据库的增,删,改,查的操作示例

public class Test extends AndroidTestCase { private shujuku shu; private SQLiteDatabase db; // 测试方法执行前调用 @Override protected void setUp() throws Exception { // TODO Auto-generated method stub   super.setUp(); shu = new shujuku(getContext()); // 拿到数据库

WebRTC VideoEngine综合应用示例(一)——视频通话的基本流程(转)

本系列目前共三篇文章,后续还会更新 WebRTC VideoEngine综合应用示例(一)——视频通话的基本流程 WebRTC VideoEngine综合应用示例(二)——集成OPENH264编解码器 WebRTC VideoEngine综合应用示例(三)——集成X264编码和ffmpeg解码 WebRTC技术的出现改变了传统即时通信的现状,它是一套开源的旨在建立浏览器端对端的通信标准的技术,支持浏览器平台,使用P2P架构.WebRTC所采用的技术都是当前VoIP先进的技术,如内部所采用的音频引

PIE SDK组件式开发综合运用示例

1. 功能概述 关于PIE SDK的功能开发,在我们的博客上已经分门别类的进行了展示,点击PIESat博客就可以访问,为了初学者入门,本章节将对从PIE SDK组件式二次开发如何搭建界面.如何综合开发进行详细的讲解. 2. 功能实现 2.1.界面搭建 最终的界面如下图所示: 图1最终结果图 2.1.1 新建项目 选择“Window窗体应用程序”,设置程序的名称和保存路径即可.(新建完成后可以将程序的窗体名称右键重命名为“FormMain”,,将窗体界面的属性的Text设置名称为“PIE应用程序”

Winform控件之DataGridView数据控件显示问题

最近在做同类的信息记录管理系统时遇到了DataGridView数据控件的显示问题,可能是2015年的上半年没有深入 学习C#开发的原因,这几天重新搬出来开发,首先遇到的问题就是动态绑定数据显示的问题,琢磨了很久,在网上查 了也不少,但是对自己的数据列表显示问题还是没有做到最佳.最后解决的方法还是自己一个尝试出来的,虽然不是 很好,但最起码遇到的问题都解决了,顿时轻松了许多. 一默认状态的绑定 也就是没有设置DataGridView控件数据列表中的列的设置,其他的属性该设置还需设置.我们来看一下实

.Net中DataGridview数据如何导出到excel表

首先,这个问题在网上有很多答案,也有很多解决的方法.其次,很多人写过类似的博客 .我的这篇博客,主要是写给那些刚刚接触或接触不久.NET并使用其做程序的人,更是写个自己,记录一下方法,方便以后使用. 在窗体中添加一个DataGridView控件,DatagridView获得数据: DataGridView1.DataSource = crList(泛型)或DataGridView1.DataSource=DataSet.Table(0).{注意:通过查询数据库,将查询到的数据放入crList或D

第二十节,基本数据类型,集合set、综合应用新数据更新老数据

基本数据类型,集合set.综合应用新数据更新老数据 创建两个字典新数据,更新原始数据,a为原始数据,b为新数据 1,分别获取到a字典和b字典的key(键),将两个字典的键分别转换成两个集合 2,找出a2集合里存在,b2集合里不存在的元素,得到:{'#2', '#3'}(需要删除:?) 3,找出b2集合里存在,a2集合里不存在的元素,得到:{'#4', '#7'}(需要新建:?) 4,找出a2集合和b2集合有交集的元素,也就是a2集合和b2集合都存在的元素,得到:{'#1'}(需要更新:?) 5,

多线程更新已排序的Datagridview数据,造成数据错位

多线程更新已排序的Datagridview数据,触发Datagridview的auto-sort时间,数据重新排序,造成后面更新数据的更新错误. 解决方法: 方法一.设置Datagridview的表头属性,DataGridViewColumnSortMode 1. 如果已经有默认的排序表头DataGridView.SortedColumn, 则 : DataGridViewColumn column = dgv.SortedColumn; //默认的排序列 column.SortMode = D

winform导出datagridview数据到excle

if (dgvResult.Rows.Count == 0) { MessageBox.Show("列表为空"); } //创建Excel对象 Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application(); excel.Application.Workbooks.Add(true); // 生成字段名称 excel.Cells[1, 1] = &qu

C#把DataGridVIew数据导出到Excel函数代码

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using Microsoft.Office.Core; using EXCEL = Microsoft.Office.Interop.Excel; //数据库支持 us