最近有网友问了我 CYQ.Data 要怎么实现批量修改,于是我就花了点时间给写了以下的示例:
示例为Winform应用,现实对DataGridView控件单元格的内容后,可以实现自动更新到数据库。
先上最终结果图:
接下上一张项目解决方案图:
由于是写Demo,所以我一般都选择用文本数据库做为示例。
我新建了一个Users.ts,内容为:
ID,int;UserName,string;CreateTime,datetime;
意思就是表名为“Users”,字段为“ID,UserName,CreateTime”。
PS:文本数据库,可用CodeFirst实体类方式,也可以直接用传统枚举型方式,以前的文章都是用CodeFirst模式演示,这里就有了枚举型演示。
对应的标准型枚举文件TableNames.cs内容为:
由于只是示例,可以用V5自带的工具生成,也可以自己新建手写了。
接下来先看一下部分代码:
首先定义一个全局的MDataTable字段: public MDataTable table;
接下来写个Load函数,页面加载时显示下数据,然后绑定到列表控件:
FormLoad的代码:
先绑定数据,这样table就不为Null了,如果一开始没数据,table也是有数据结构的。
判断如果数据少于100行,下面的几行代码就是批量插入了,然后重新绑定到控件。
如何进行量更新呢?
方法很简单,只要处理单元格的列值改变状态就调用一下就可以了。
当然了了,由于是批量,你也可以把代码放到一个按钮里去,通过按钮点击再去确定指更新。
理论上,指量更新就到这里为止了,这里再补一点内容,就是列的中文显示: 通常我们查询后,列名都是英文的,但是系统多数是显示中文的,这里给出一种解决方案: private void gvUsers_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) { FieldKeyValue.FormatHeaderText(gvUsers); }
我们在控件的DataBindingComplete事件里,翻译一下列头就可以了。
这里我把它封装到一个FieldKeyValue类里,代码如下:
} public static string GetName(string key) { return GetName(key, null); } public static string GetName(string key, string tableName) { Dictionary<string, string> dictionary = GetFieldDescriptionDictionary(); if (dictionary != null) { if (tableName != null && dictionary.ContainsKey(tableName + "_" + key)) { return dictionary[tableName + "_" + key]; } else if (dictionary.ContainsKey(key)) { return dictionary[key]; } } return key; } private static Dictionary<string, string> _Dic = null; private static Dictionary<string, string> GetFieldDescriptionDictionary() { if (_Dic == null) { _Dic = new Dictionary<string, string>(); #region 字典添加 _Dic.Add("ID", "编号"); _Dic.Add("UserName", "用户名"); _Dic.Add("CreateTime", "创建日期"); #endregion } return _Dic; }
只要添加字典对应关系就可以了,由于有时候不同的表名,相同字段可能有不同的翻译,所以字典是支持:
_Dic.Add("TableA_ID", "编号"); _Dic.Add("TableB_ID", "标识");
该类会优先判断查询“表名_字段名”,如果找不到才找“字段名”。
最后提供Demo项目源码下载:
对于Winform的分页,可以下载我的Winform分页控件:C#Winform通用分页控件实战篇(提供源码下载)