DataGridView中使用BindSource進行數據綁定操作

使用WinForm已經有好長的一段時間,雖然一直知道得數據綁定是.NET下一項很強大的功能,平時也用的不少,但都是自己用代碼寫的綁定方法,純代碼流有好處是可以足夠的靈活,數據你愛怎麼折騰就怎麼折騰,而且如果結構設計得好的話可以很方便重用。還有一個問題是,用WinForm窗體控件自帶的綁定方式,會生出很多莫名的文件,這還不要緊,一旦涉及到ADO的東西我直接就繳械了——自從認識LinQ後我就很久沒用字符串來操作數據庫啦,也許那會效率很高,但也沒有證據顯示LinQ的效率低,在非嚴謹應用場景裏,我更重視開發的效率。


DataGridView控件,凡是涉及到數據庫一般離不開這個控件,其功能強大到足以讓我仰視不止,在DataGridView下對數據庫進行增刪修改是家常便飯,我還真不敢說我對這個控件用得有多熟,如果可以選擇我還真不願意將精力用在枯燥的界面處理上。


重新用回SQLServer的東西,因爲處理的幾個表比較簡單,所以我打算直接用WinForm自動生成的數據綁定功能,Google了一番,發現網上並沒比較完整的例程(可能東西比較簡單),於是小小的作一下筆記,經饗後來者,順便做一個備忘。


1、建立SQLServer的數據表


這點是玩SQLServer的入門活,我就不細說,因爲是做演示,我弄了一個最簡表出來,如下圖所示,對了,我建表用的是SQL Server Manager Studio,對大多人來說應該沒有難度。

202103261.jpg


2、在工程中生成DataSet數據集


我個人對DataSet的理解只數據庫實體的一個抽象,簡單的說就是將原本用字符串操作數據庫轉變成用Adapter來操作,當然,其中也保留了靈活的SQL指令功能。


在生成DataSet之前,請在VisualStudio中的服務器資源管理器裏生成一項“數據連接”,連接步驟1數據表Table_Test所在的數據庫,如下圖所示(圖中除Table_Test外其他請你們忽略,其他表不是我寫本Blog所要用到的)。

203254658.jpg


建立好數據連接後,在工程裏新建一個數據集(DataSet),我個人的命名是MyDataSet,建立好後你會在資源管理窗口裏見到一個MyDataSet.xsd的文件,你若有興趣可以看一下里面的東西,我不解釋。你雙擊xsd這個文件,它會提示你從服務器資源管理器裏導入數據,你打開服務器資源管理器將上圖顯示的Table_Test直接拖到裏面,會自動生成下面的表,DataSet的強大在於TableAdapter的強大,這是後話。

203958179.jpg


3、建立DataGridView的界面


新建一個WinForm的窗體,從工具箱裏往窗體裏拖一個DataGridView的控件,這很簡單,控件名姑且默認就好了。接下來是開始綁定數據。


DataGridView的右上角有個小三角形,點擊——選擇數據源——其他數據源——項目數據源——MyDataSet——Table_Test,好了,DataGridView就已經作好綁定,它會自動顯示Table_Test的全部內容,我這裏當然是空,如下圖所示:

204819324.jpg


上面ColumnHeader的樣式我是修改過的,別太糾結,但重點不在這裏,你看當前窗體的下方,VisualStudio會自動生成下面的幾個東西,這分別是MyDataSet、BindSource、TableAdapter的實例,是屬於當前窗體下的私有成員,這纔是最關建的內容,當然,如果你僅是作顯示完全可以不用理會:

205004860.jpg


4、DataGridView的編輯


在DataGridView控件右上角的小三角形下,有三個選項:啓動添加、啓動編輯、啓動刪除,一般情況下要視具體情況而定,我這姑且就全選了。


在VisualStudio下生成工程,如下圖所示,你可以隨意編輯,因爲ID的列,我在建表時設定自增量,並作爲表的一個主鍵,所以本列你是編輯不了的,它會自動填充ID,只是我想不明白ID怎麼會往負裏增大呢?

205744799.jpg


5、綁定數據的保存


到這一步之前,我們還沒有使用任何一句代碼,我只能說,單純的數據顯示是非常傻瓜的,如果你想純代碼做到這一步,我想就算不困難也要花不少時間的。


數據綁定的概念是,將數據庫的數據同步到數據控件上,當控件上顯示的數據作了修改後,也一定能同步回數據庫裏,這一步就必須要動用到偉大的Code了。保存的時機自己可以隨便,我在此是用了一個ContextMenuStrip的菜單控件,通過右鍵顯示快捷菜單,再點擊保存,其響應函數的內容如下:

/// <summary>
/// 綁定數據時自動生成的代碼,只用於顯示數據
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MaterialEditForm_Load(object sender, EventArgs e)
{
    // TODO: 這行代碼將數據加載到表“myDataSet.Table_Test”中。您可以根據需要移動或刪除它。
    this.table_TestTableAdapter.Fill(this.myDataSet.Table_Test);
}
//
//
/// <summary>
/// 右鍵快捷菜單的響應函數
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void 保存數據ToolStripMenuItem_Click(object sender, EventArgs e)
{
    //結束DataGridView的編輯狀態
    this.dataGridView1.EndEdit();
    //結束BindSource的編輯狀態,爲提交更改作準備,重要
    this.tableTestBindingSource.EndEdit();
    //
    //檢查是否作出更改
    if (this.myDataSet.GetChanges() == null)
    {
        return;
    }
    //
    //同步數據至實體數據庫中
    this.table_TestTableAdapter.Update(this.myDataSet);
}


6、結語


相像過麼?正常情況下我們要插入哪怕一條小小的記錄(更別提刪除跟更新了),加上各種過濾的狀況,都不能說是很容易的事,可使用數據綁定的方法,只需要上面數句話就可以輕易完成添加、修改、刪除等全部的功況——這簡直是逆天的節奏啊!!!


(原來在作保存後,作爲主鍵的ID是會自動變成正數的,如下圖所示:)

211505764.jpg




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章