使用WinForm已经有好长的一段时间,虽然一直知道得数据绑定是.NET下一项很强大的功能,平时也用的不少,但都是自己用代码写的绑定方法,纯代码流有好处是可以足够的灵活,数据你爱怎么折腾就怎么折腾,而且如果结构设计得好的话可以很方便重用。还有一个问题是,用WinForm窗体控件自带的绑定方式,会生出很多莫名的文件,这还不要紧,一旦涉及到ADO的东西我直接就缴械了——自从认识LinQ后我就很久没用字符串来操作数据库啦,也许那会效率很高,但也没有证据显示LinQ的效率低,在非严谨应用场景里,我更重视开发的效率。


DataGridView控件,凡是涉及到数据库一般离不开这个控件,其功能强大到足以让我仰视不止,在DataGridView下对数据库进行增删修改是家常便饭,我还真不敢说我对这个控件用得有多熟,如果可以选择我还真不愿意将精力用在枯燥的界面处理上。


重新用回SQLServer的东西,因为处理的几个表比较简单,所以我打算直接用WinForm自动生成的数据绑定功能,Google了一番,发现网上并没比较完整的例程(可能东西比较简单),于是小小的作一下笔记,经飨后来者,顺便做一个备忘。


1、建立SQLServer的数据表


这点是玩SQLServer的入门活,我就不细说,因为是做演示,我弄了一个最简表出来,如下图所示,对了,我建表用的是SQL Server Manager Studio,对大多人来说应该没有难度。

DataGridView中使用BindSource进行数据绑定操作


2、在工程中生成DataSet数据集


我个人对DataSet的理解只数据库实体的一个抽象,简单的说就是将原本用字符串操作数据库转变成用Adapter来操作,当然,其中也保留了灵活的SQL指令功能。


在生成DataSet之前,请在VisualStudio中的服务器资源管理器里生成一项“数据连接”,连接步骤1数据表Table_Test所在的数据库,如下图所示(图中除Table_Test外其他请你们忽略,其他表不是我写本Blog所要用到的)。

DataGridView中使用BindSource进行数据绑定操作


建立好数据连接后,在工程里新建一个数据集(DataSet),我个人的命名是MyDataSet,建立好后你会在资源管理窗口里见到一个MyDataSet.xsd的文件,你若有兴趣可以看一下里面的东西,我不解释。你双击xsd这个文件,它会提示你从服务器资源管理器里导入数据,你打开服务器资源管理器将上图显示的Table_Test直接拖到里面,会自动生成下面的表,DataSet的强大在于TableAdapter的强大,这是后话。

DataGridView中使用BindSource进行数据绑定操作


3、建立DataGridView的界面


新建一个WinForm的窗体,从工具箱里往窗体里拖一个DataGridView的控件,这很简单,控件名姑且默认就好了。接下来是开始绑定数据。


DataGridView的右上角有个小三角形,点击——选择数据源——其他数据源——项目数据源——MyDataSet——Table_Test,好了,DataGridView就已经作好绑定,它会自动显示Table_Test的全部内容,我这里当然是空,如下图所示:

DataGridView中使用BindSource进行数据绑定操作


上面ColumnHeader的样式我是修改过的,别太纠结,但重点不在这里,你看当前窗体的下方,VisualStudio会自动生成下面的几个东西,这分别是MyDataSet、BindSource、TableAdapter的实例,是属于当前窗体下的私有成员,这才是最关建的内容,当然,如果你仅是作显示完全可以不用理会:

DataGridView中使用BindSource进行数据绑定操作


4、DataGridView的编辑


在DataGridView控件右上角的小三角形下,有三个选项:启动添加、启动编辑、启动删除,一般情况下要视具体情况而定,我这姑且就全选了。


在VisualStudio下生成工程,如下图所示,你可以随意编辑,因为ID的列,我在建表时设定自增量,并作为表的一个主键,所以本列你是编辑不了的,它会自动填充ID,只是我想不明白ID怎么会往负里增大呢?

DataGridView中使用BindSource进行数据绑定操作


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是会自动变成正数的,如下图所示:)

DataGridView中使用BindSource进行数据绑定操作