最近有網友問了我 CYQ.Data 要怎么實現批量修改,於是我就花了點時間給寫了以下的示例:
示例為Winform應用,現實對DataGridView控件單元格的內容后,可以實現自動更新到數據庫。
先上最終結果圖:

接下上一張項目解決方案圖:

由於是寫Demo,所以我一般都選擇用文本數據庫做為示例。
我新建了一個Users.ts,內容為:
ID,int;
UserName,string;
CreateTime,datetime;
意思就是表名為“Users”,字段為“ID,UserName,CreateTime”。
PS:文本數據庫,可用CodeFirst實體類方式,也可以直接用傳統枚舉型方式,以前的文章都是用CodeFirst模式演示,這里就有了枚舉型演示。
對應的標准型枚舉文件TableNames.cs內容為:
/// <summary>
/// TableNames 的摘要說明
/// </summary>
public enum TableNames
{
Users,
}
public enum Users
{
ID, UserName, CreateTime
}
由於只是示例,可以用V5自帶的工具生成,也可以自己新建手寫了。
接下來先看一下部分代碼:
首先定義一個全局的MDataTable字段:
public MDataTable table;
接下來寫個Load函數,頁面加載時顯示下數據,然后綁定到列表控件:
private void LoadData()
{
using (MAction action = new MAction(TableNames.Users))
{
table = action.Select();
table.Bind(gvUsers);
}
}
FormLoad的代碼:
private void Form1_Load(object sender, EventArgs e)
{
LoadData();
if (table.Rows.Count < 100)
{
//批量添加數據。
//給table批量添加行。
MDataRow row = null;
for (int i = 0; i < 100; i++)
{
row = table.NewRow();
row.Set(Users.UserName, "User:" + DateTime.Now.Millisecond);
row.Set(Users.CreateTime, DateTime.Now);
table.Rows.Add(row);
}
//調用表的批量添加。
table.AcceptChanges(AcceptOp.Insert);
//重新綁定到控件。
table.Bind(gvUsers);
}
}
先綁定數據,這樣table就不為Null了,如果一開始沒數據,table也是有數據結構的。
判斷如果數據少於100行,下面的幾行代碼就是批量插入了,然后重新綁定到控件。
如何進行量更新呢?
private void gvUsers_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (table.AcceptChanges(AcceptOp.Update))
{
index++;
labTip.Text = "數據已更新到數據庫..." + index;
}
else
{
labTip.Text = "數據更新失敗";
}
}
方法很簡單,只要處理單元格的列值改變狀態就調用一下就可以了。
當然了了,由於是批量,你也可以把代碼放到一個按鈕里去,通過按鈕點擊再去確定指更新。
理論上,指量更新就到這里為止了,這里再補一點內容,就是列的中文顯示:
通常我們查詢后,列名都是英文的,但是系統多數是顯示中文的,這里給出一種解決方案:
private void gvUsers_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
FieldKeyValue.FormatHeaderText(gvUsers);
}
我們在控件的DataBindingComplete事件里,翻譯一下列頭就可以了。
這里我把它封裝到一個FieldKeyValue類里,代碼如下:
public class FieldKeyValue
{
public static void FormatHeaderText(DataGridView gv)
{
for (int i = 0; i < gv.Columns.Count; i++)
{
gv.Columns[i].HeaderText = GetName(gv.Columns[i].HeaderText);
}
}
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項目源碼下載:
CYQ.Data_V5_Test_Win.rar

對於Winform的分頁,可以下載我的Winform分頁控件:C#Winform通用分頁控件實戰篇(提供源碼下載)