.NET 2.0 - WinForm Control - DataGridView 数据绑定

在应用开发中常常用到这样的应用: DataGridView用来显示全体数据,还有由一些TextBox控件来提供修改功能。这里如果用挨个赋值的办法就不好了。.NET中提供的一个重要的技术就是——数据绑定。数据绑定中几个重要对象及属性有:Control.DataSource属性,BindingSource对象,Form.BindingContext属性。

这里通过一个例子来说明WinForm开发中如何使用数据绑定。首先有数据结构形如:(这里使用NorthWind的Sample数据。)

.NET 2.0 - WinForm Control - DataGridView 数据绑定

Customers和Orders数据是1:n的关系,Orders和OrdersDetails数据是1:n的关系。

因此设计Form如图,ListView绑定Custormers数据,入力控件绑定Customers里数据的其他字段。OrdersDataGridView绑定Orders数据,DetaiDataGridView绑定Order Details数据。

.NET 2.0 - WinForm Control - DataGridView 数据绑定

首先通过DataSet的DataRelation建立三表的关系:

.NET 2.0 - WinForm Control - DataGridView 数据绑定.NET 2.0 - WinForm Control - DataGridView 数据绑定PrivateSubQueryData()SubQueryData()
.NET 2.0 - WinForm Control - DataGridView 数据绑定
.NET 2.0 - WinForm Control - DataGridView 数据绑定
IfobjConnIsNothingThenReturn
.NET 2.0 - WinForm Control - DataGridView 数据绑定objDataSet
=NewDataSet("Data")
.NET 2.0 - WinForm Control - DataGridView 数据绑定
.NET 2.0 - WinForm Control - DataGridView 数据绑定
DimstrSqlAsString="select*fromcustomers"
.NET 2.0 - WinForm Control - DataGridView 数据绑定
DimobjDbAdapterAsOleDb.OleDbDataAdapter=NewOleDb.OleDbDataAdapter(strSql,objConn)
.NET 2.0 - WinForm Control - DataGridView 数据绑定objDbAdapter.Fill(objDataSet,
"Customers")
.NET 2.0 - WinForm Control - DataGridView 数据绑定
.NET 2.0 - WinForm Control - DataGridView 数据绑定objDbAdapter.SelectCommand.CommandText
="select*fromorders"
.NET 2.0 - WinForm Control - DataGridView 数据绑定objDbAdapter.Fill(objDataSet,
"Orders")
.NET 2.0 - WinForm Control - DataGridView 数据绑定
.NET 2.0 - WinForm Control - DataGridView 数据绑定objDbAdapter.SelectCommand.CommandText
="select*from[orderdetails]"
.NET 2.0 - WinForm Control - DataGridView 数据绑定objDbAdapter.Fill(objDataSet,
"OrderDetails")
.NET 2.0 - WinForm Control - DataGridView 数据绑定
.NET 2.0 - WinForm Control - DataGridView 数据绑定objDataSet.Relations.Add(
"CustomerOrder",objDataSet.Tables("Customers").Columns("CustomerID"),objDataSet.Tables("Orders").Columns("CustomerID"))
.NET 2.0 - WinForm Control - DataGridView 数据绑定objDataSet.Relations.Add(
"OrderDetail",objDataSet.Tables("Orders").Columns("OrderID"),objDataSet.Tables("OrderDetails").Columns("OrderID"))
.NET 2.0 - WinForm Control - DataGridView 数据绑定
.NET 2.0 - WinForm Control - DataGridView 数据绑定
EndSub

通过BindingSource绑定到DataGridView上,需要注意的是比较.NET 1.1的绑定,这里用BindingSource取代,在创建DataGridViewOrders的BindingSource对象的DataSource使用的是customBindingSource,而DataMember是Customers表和Orders表的DataRelation的名字——CustomerOrder。

orderBindingSource.DataSource = customBindingSource
orderBindingSource.DataMember = "CustomerOrder"

同理Detail的BindingSource对象的DataSource使用的是orderBindingSource,而DataMember是Orders表和Order Details表的DataRelation的名字——OrderDetail。

detailBindingSource.DataSource = orderBindingSource
detailBindingSource.DataMember = "OrderDetail"

.NET 2.0 - WinForm Control - DataGridView 数据绑定.NET 2.0 - WinForm Control - DataGridView 数据绑定PrivateSubBindData()SubBindData()
.NET 2.0 - WinForm Control - DataGridView 数据绑定
.NET 2.0 - WinForm Control - DataGridView 数据绑定
IfobjDataSetIsNothingThenReturn
.NET 2.0 - WinForm Control - DataGridView 数据绑定
.NET 2.0 - WinForm Control - DataGridView 数据绑定
DimcustomBindingSourceAsBindingSource=NewBindingSource
.NET 2.0 - WinForm Control - DataGridView 数据绑定
DimorderBindingSourceAsBindingSource=NewBindingSource
.NET 2.0 - WinForm Control - DataGridView 数据绑定
DimdetailBindingSourceAsBindingSource=NewBindingSource
.NET 2.0 - WinForm Control - DataGridView 数据绑定
.NET 2.0 - WinForm Control - DataGridView 数据绑定customBindingSource.DataSource
=objDataSet
.NET 2.0 - WinForm Control - DataGridView 数据绑定customBindingSource.DataMember
="Customers"
.NET 2.0 - WinForm Control - DataGridView 数据绑定
.NET 2.0 - WinForm Control - DataGridView 数据绑定orderBindingSource.DataSource
=customBindingSource
.NET 2.0 - WinForm Control - DataGridView 数据绑定orderBindingSource.DataMember
="CustomerOrder"
.NET 2.0 - WinForm Control - DataGridView 数据绑定
.NET 2.0 - WinForm Control - DataGridView 数据绑定detailBindingSource.DataSource
=orderBindingSource
.NET 2.0 - WinForm Control - DataGridView 数据绑定detailBindingSource.DataMember
="OrderDetail"
.NET 2.0 - WinForm Control - DataGridView 数据绑定
.NET 2.0 - WinForm Control - DataGridView 数据绑定
Me.lstCustom.DataSource=customBindingSource
.NET 2.0 - WinForm Control - DataGridView 数据绑定
Me.lstCustom.ValueMember="ContactName"
.NET 2.0 - WinForm Control - DataGridView 数据绑定
Me.lstCustom.DisplayMember="ContactName"
.NET 2.0 - WinForm Control - DataGridView 数据绑定
.NET 2.0 - WinForm Control - DataGridView 数据绑定
Me.DataGridView1.DataSource=orderBindingSource
.NET 2.0 - WinForm Control - DataGridView 数据绑定
Me.DataGridView2.DataSource=detailBindingSource
.NET 2.0 - WinForm Control - DataGridView 数据绑定
Me.DataGridView1.AutoResizeColumns()
.NET 2.0 - WinForm Control - DataGridView 数据绑定
Me.DataGridView2.AutoResizeColumns()
.NET 2.0 - WinForm Control - DataGridView 数据绑定
.NET 2.0 - WinForm Control - DataGridView 数据绑定
Me.txtName.DataBindings.Add("Text",customBindingSource,"ContactName")
.NET 2.0 - WinForm Control - DataGridView 数据绑定
Me.txtContactTitle.DataBindings.Add("Text",customBindingSource,"ContactTitle")
.NET 2.0 - WinForm Control - DataGridView 数据绑定
Me.txtAddress.DataBindings.Add("Text",customBindingSource,"Address")
.NET 2.0 - WinForm Control - DataGridView 数据绑定
Me.txtCity.DataBindings.Add("Text",customBindingSource,"City")
.NET 2.0 - WinForm Control - DataGridView 数据绑定
Me.txtRegion.DataBindings.Add("Text",customBindingSource,"Region")
.NET 2.0 - WinForm Control - DataGridView 数据绑定
Me.txtPostalCode.DataBindings.Add("Text",customBindingSource,"PostalCode")
.NET 2.0 - WinForm Control - DataGridView 数据绑定
Me.txtPhone.DataBindings.Add("Text",customBindingSource,"Phone")
.NET 2.0 - WinForm Control - DataGridView 数据绑定
Me.txtFax.DataBindings.Add("Text",customBindingSource,"Fax")
.NET 2.0 - WinForm Control - DataGridView 数据绑定
Me.txtCountry.DataBindings.Add("Text",customBindingSource,"Country")
.NET 2.0 - WinForm Control - DataGridView 数据绑定
.NET 2.0 - WinForm Control - DataGridView 数据绑定
EndSub

.NET 2.0 - WinForm Control - DataGridView 数据绑定

而浏览数据,可以通过BindingManagerBase的Position来控制:

.NET 2.0 - WinForm Control - DataGridView 数据绑定.NET 2.0 - WinForm Control - DataGridView 数据绑定PrivateSubbtnFirst_Click()SubbtnFirst_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesbtnFirst.Click
.NET 2.0 - WinForm Control - DataGridView 数据绑定
'DimbindingAsBinding=Me.txtName.DataBindings("Text")
.NET 2.0 - WinForm Control - DataGridView 数据绑定
'DimmanagerAsBindingManagerBase=binding.BindingManagerBase
.NET 2.0 - WinForm Control - DataGridView 数据绑定
DimmanagerAsBindingManagerBase=Me.BindingContext(Me.lstCustom.DataSource)
.NET 2.0 - WinForm Control - DataGridView 数据绑定manager.Position
=0
.NET 2.0 - WinForm Control - DataGridView 数据绑定
EndSub

.NET 2.0 - WinForm Control - DataGridView 数据绑定
.NET 2.0 - WinForm Control - DataGridView 数据绑定.NET 2.0 - WinForm Control - DataGridView 数据绑定
PrivateSubbtnPrev_Click()SubbtnPrev_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesbtnPrev.Click
.NET 2.0 - WinForm Control - DataGridView 数据绑定
DimmanagerAsBindingManagerBase=Me.BindingContext(Me.lstCustom.DataSource)
.NET 2.0 - WinForm Control - DataGridView 数据绑定
Ifmanager.Position>0Then
.NET 2.0 - WinForm Control - DataGridView 数据绑定manager.Position
-=1
.NET 2.0 - WinForm Control - DataGridView 数据绑定
EndIf
.NET 2.0 - WinForm Control - DataGridView 数据绑定
EndSub

.NET 2.0 - WinForm Control - DataGridView 数据绑定
.NET 2.0 - WinForm Control - DataGridView 数据绑定.NET 2.0 - WinForm Control - DataGridView 数据绑定
PrivateSubbtnNext_Click()SubbtnNext_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesbtnNext.Click
.NET 2.0 - WinForm Control - DataGridView 数据绑定
DimmanagerAsBindingManagerBase=Me.BindingContext(Me.lstCustom.DataSource)
.NET 2.0 - WinForm Control - DataGridView 数据绑定
Ifmanager.Position<manager.Count-1Then
.NET 2.0 - WinForm Control - DataGridView 数据绑定manager.Position
+=1
.NET 2.0 - WinForm Control - DataGridView 数据绑定
EndIf
.NET 2.0 - WinForm Control - DataGridView 数据绑定
EndSub

.NET 2.0 - WinForm Control - DataGridView 数据绑定
.NET 2.0 - WinForm Control - DataGridView 数据绑定.NET 2.0 - WinForm Control - DataGridView 数据绑定
PrivateSubbtnLast_Click()SubbtnLast_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesbtnLast.Click
.NET 2.0 - WinForm Control - DataGridView 数据绑定
DimmanagerAsBindingManagerBase=Me.BindingContext(Me.lstCustom.DataSource)
.NET 2.0 - WinForm Control - DataGridView 数据绑定manager.Position
=manager.Count-1
.NET 2.0 - WinForm Control - DataGridView 数据绑定
EndSub