BindingSource控件是.NET Framework 2.0提供的新控件之一。BindingSource控件与数据源建立连接,然后将窗体中的控件与BindingSource控件建立绑定关系来实现数据绑定,简化数据绑定的过程(貌似与ObjectDataSource之类的控件性质相似)。 想了解更多的话,到MSND:http://msdn.microsoft.com/zh-cn/library/ms404320(VS.90).aspx
BindingSource控件即是一个连接后台数据库的渠道,同时又是一个数据源,因为BindingSource控件即 支持向后台数据库发送命令来检索数据,又支持直接通过BindingSource控件对数据进行访问、排序、筛选和更新操作。BindingSource控件能够自动管理许多绑定问题。
BindingSource控件没有运行时界面,无法在用户界面上看到该控件。
BindingSource控件通过Current属性访问当前记录,通过List属性访问整个数据表。
下表列出了BindingSource控件的主要属性:
属性 说明
AllowEdit 指示是否可以编辑BindingSource控件中的记录。
AllowNew 指示是否可以使用 AddNew 方法向BindingSource控件添加记录
AllowRemove 指示是否可从BindingSource控件中删除记录。
Count 获取BindingSource控件中的记录数。
CurrencyManager 获取与BindingSource控件关联的当前记录管理器。
Current 获取BindingSource控件中的当前记录
DataMember 获取或设置连接器当前绑定到的数据源中的特定数据列表或数据库表。
DataSource 获取或设置连接器绑定到的数据源。
Filter 获取或设置用于筛选的表达式。
Item 获取或设置指定索引的记录。
Sort 获取或设置用于排序的列名来指定排序。
Position 取得或設定基礎清單中目前項目的索引。返回 以零起始的索引,指定基礎清單中目前項目的位置。
通过Current属性及RemoveCurrent、EndEdit、CancelEdit、Add和AddNew方法可实现对当前记录的编辑操作。
下表列出了BindingSource控件的主要方法
方法 说明
Add 将现有项添加到内部列表中
CancelEdit 从列表中移除所有元素
EndEdit 将挂起的更改应用于基础数据源。
Find 在数据源中查找指定的项。
MoveFirst 移至列表中的第一项。
MoveLast 移至列表中的最后一项。
MoveNext 移至列表中的下一项。
MovePrevious 移至列表中的上一项。
RemoveCurrent 从列表中移除当前项。
如果你是通过从[数据源]拖拽表到Form上生成的DataGridView及数据,那就用VS05自动生成的 BindingNavigator进行增、删、改。通常你甚至连一行代码都不用写。 另外,从vs05开始强烈推荐使用BindingSource作为控件和数据之间的中间层。就是说控件绑定到 BindingSource, BindingSource再绑定到数据对象(date item)或对象列表 (data item list)。 这样做有 许多好处。 BindingSource.EndEdit();会把更新提交到内存中的对象或对象列表(如DataSet)。 BindingSource.Update方法会把更新提交到数据库。
以Vs2005操作Access2003数据库为例(不用向导)
建一个Access 2003文件 db1.mdb 建一个表(Person) :表结构如下,输入一些内容
UID 自动编号 主键
name 文字
age 数字
sex 文字
Vs2005建一个winform,把一个DataGridView、Button拖到Form上。 运行一下,再把db1.mdb复制到Debug目录下。 给类增加三个成员:
private DataTable dt;
private BindingSource bs;
private OleDbDataAdapter da;
双击Form1,在Form1_Load里 :
private void Form1_Load(object sender, EventArgs e)
{
TODO: 这行代码将数据加载到表“db1DataSet.stu”中。您可以根据需要移动或移除它。
//this.stuTableAdapter.Fill(this.db1DataSet.stu);
OleDbConnection conn = new OleDbConnection();
conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db1.mdb";
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = conn;
cmd.CommandText = "select * from Person";
dt = new DataTable();
da = new OleDbDataAdapter();
da.SelectCommand = cmd;
OleDbCommandBuilder cb = new OleDbCommandBuilder(da);
da.Fill(dt);
bs = new BindingSource();
bs.DataSource = dt;
dataGridView1.DataSource = bs;
}
双击button1,在button1_Click里
private void button1_Click(object sender, EventArgs e)
{
da.Update(dt);
MessageBox.Show("OK");
}
把我举的例子里
private BindingSource bs;//去掉
bs = new BindingSource();
bs.DataSource = dt;
dataGridView1.DataSource = bs; //也可以不用BindingSource,直接DataSource=dt;
这三行改成
dataGrid1.DataSource = dt;
---------
'永远'记住一点:在使用DataAdapter的应用里,你根本无需手动打开连接和关闭连接。
也就是在你的代码中根本不应看到Conn.Open()、Conn.Close()之类的东西。
因为DataAdapter会在自动为你打开和关闭连接。
转自:http://www.cnblogs.com/wujilong/articles/2012163.html
1.引言
BindingSource组件是数据源和控件间的一座桥,同时提供了大量的API和Event供我们使用。使用这些API我们可以将Code与各种具体类型数据源进行解耦;使用这些Event我们可以洞察数据的变化。
2.简单绑定
DataTable myTable = myTableAdapter.GetData();//创建Table
BindingSource myBindingSource= new BindingSource();//创建BindingSource
DataGridView myGrid = new DataGridView();//创建GridView
myGrid.DataSource = myBindingSource;//将BindingSource绑定到GridView
myTable;//绑定数据到BindingSource
注:
1)绑定到DataTable,其实是绑定到DataTable提供的DataView上。每个DataTable都有一个缺省的DataView
2)DataView是绑定的实质,正如其名,它是DataTable的数据的展现。因此可以对同一个DataTable
,构建多个DataView,进而可以对这同样的数据实施不同的过滤、排序等方法,从不同侧面展示DataTable。这也体现了一定的MVC思想。
3)BindingSouce也可作为数据(其实是数据引用)的容器在不同窗体间传递,从而实现在弹出窗体中对数据的编辑
3.主细表
以上图所示数据为例:
1)DataSet:myDataSet
2)DataTable:ParentTable、ChildTable、GrandChildTable
3)Relation:FK_Parent_Child、FK_Child_GrandChild
//绑定父数据
parentBindingSource.DataSource = myDataSet;
parentBindingSource.DataMember = "ParentTable";
m_GrandParentGrid.DataSource = m_GrandParentBindingSource;
//绑定子数据。
childBindingSource.DataSource = parentBindingSource;//绑定到“父BindingSource”,而不是父TablechildBindingSource.DataMember = "FK_Child_GrandChild";//绑定到“父-子Relation”
//绑定孙子数据。
grandChildBindingSource.DataSource = childBindingSource;//绑定到“子BindingSource”grandChildBindingSource.DataMember = "FK_Child_GrandChild";//绑定到“子-孙Relation”
这样你就可以在Form上摆上3个DataView,分布绑定到这3个BindingSouce,很容易就实现了主细表关联展现。
4.数据操纵
要操纵数据,首先需要获取当前数据项。BindingSource的Current属性返回DataRowView类型的对象(就像DataView是对DataTable的封装一样,DataRowView是对DataRow的封装),它是对当前数据项的封装,可以通过类型转换变成你想要的对象。
DataRowView currentRowView = myBindingSource.Current;//获取当前RowView
CustomersRow custRow = currentRowView.Row as CustomersRow;//类型转换为当前数据项
string company = custRow.CompanyName;//使用当前数据项
string phoneNo = custRow.Phone;
5.用BindingSource做数据容器
BindingSource还可以用作数据容器,即便它没有绑定到数据源上,它内部有一个可以容纳数据的list。
5.1Add方法
调用Add方法会在BindingSource的list中插入数据项。如果这时第一次插入数据,并且没有绑定数据,那么插入数据的类型就决定了今后此list中数据的类型。
注:
1)此时再插入其它类型对象会抛出InvalidOperationException异常
2)设置DataSource属性时会刷新list,造成Add方法添加到list中的数据丢失
5.2AddNew方法
AddNew方法返回BindingSourc所容纳数据类型的对象;如果之前没有容纳数据,则会返回Object对象。
AddNew方法会调用EndEdit方法,并将提交对当前数据的操纵;然后新数据项就成为当前项。
AddNew方法会引发AddingNew事件,可以在此事件中为数据项赋值,或者创建新数据项
private void OnAddingNew(object sender, AddingNewEventArgs e)
{
e.NewObject = new MyCustomObject();//
}
6.用BindingSource对数据排序、过滤、搜索
6.1 Sort
为Sort属性赋上Sort表达式,可以对数据进行排序
myBindingSource.Sort = "ContactName ASC";//对ContanctName列按ASC进行排序
myBindingSource.Sort = "Region ASC, CompanyName DESC"//先按Region、再按CompanyName排序
6.2 Find
Find方法根据指定属性和关键字进行查找,并返回第一个匹配对象的Index
int index = m_CustomersBindingSource.Find("CompanyName",IBM);//按CompanyName查找IBM
if (index != -1)
{
myBindingSource.Position = index;//定位BindingSource
}
6.3 Filter
为Filter属性赋上表达式,可以对数据进行过滤
m_CustomersBindingSource.Filter = "Country = 'Germany'";//过滤出Country属性为Germany的数据
7.用Event监控数据
7.1 Event
1)AddingNew
调用AddNew()方法时触发。
2)BindingComplete
当控件完成数据绑定时触发,说明控件已经从数据源中读取当前数据项的值。当BindingSource重新绑定或当前数据项改变时,会触发此事件
注:
- 当有多个控件绑定到同一数据源时,这个事件会触发多次
3)CurrrentChanged
当前数据项改变时触发此事件。触发此事件的情况如下
- Position属性改变时
- 添加、删除数据时
- DataSource或DataMember属性改变时
4)CurrentItemChanged
当前数据项的值改变时触发
5)DataError
通常输入无效数据时,由CurrencyManage抛出异常,从而触发此事件。
6)PositionChanged
Position属性改变时触发此事件。
7)ListChanged
数据集合改变时触发。触发此事件的情况如下
- adding, editing, deleting, 或 moving 数据项时
改变那些会影响List行为特征的属性时,如AllowEdit属性
- 替换List时(绑到新数据源)
8.限制数据修改
BindingSource不仅是数据源与控件间的“桥梁”,同时也是数据源的“看门人”。通过BindingSource,我们可以控制对数据的修改。
BinidingSource的AllowEdit, AllowNew和AllowRemove属性可以控制客户端代码和控件对数据的修改