在应用开发中常常用到这样的应用: DataGridView用来显示全体数据,还有由一些TextBox控件来提供修改功能。这里如果用挨个赋值的办法就不好了。.NET中提供的一个重要 的技术就是——数据绑定。数据绑定中几个重要对象及属性有:Control.DataSource属性,BindingSource对 象,Form.BindingContext属性。
这里通过一个例子来说明WinForm开发中如何使用数据绑定。首先有数据结构形如:(这里使用NorthWind的Sample数据。)
![](http://p.blog.csdn.net/images/p_blog_csdn_net/fangxinggood/01_DataRelation.gif)
Customers和Orders数据是1:n的关系,Orders和OrdersDetails数据是1:n的关系。
因此设计Form如图,ListView绑定Custormers数据,入力控件绑定Customers里数据的其他字段。OrdersDataGridView绑定Orders数据,DetaiDataGridView绑定Order Details数据。
![](http://p.blog.csdn.net/images/p_blog_csdn_net/fangxinggood/02_FormDesign1.gif)
首先通过DataSet的DataRelation建立三表的关系:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
Private Sub QueryData()Sub QueryData()
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
If objConn Is Nothing Then Return
objDataSet = New DataSet("Data")
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
Dim strSql As String = "select * from customers"
Dim objDbAdapter As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(strSql, objConn)
objDbAdapter.Fill(objDataSet, "Customers")
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
objDbAdapter.SelectCommand.CommandText = "select * from orders"
objDbAdapter.Fill(objDataSet, "Orders")
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
objDbAdapter.SelectCommand.CommandText = "select * from [order details]"
objDbAdapter.Fill(objDataSet, "OrderDetails")
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
objDataSet.Relations.Add("CustomerOrder", objDataSet.Tables("Customers").Columns("CustomerID"), objDataSet.Tables("Orders").Columns("CustomerID"))
objDataSet.Relations.Add("OrderDetail", objDataSet.Tables("Orders").Columns("OrderID"), objDataSet.Tables("OrderDetails").Columns("OrderID"))
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
End Sub 通过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"
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
Private Sub BindData()Sub BindData()
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
If objDataSet Is Nothing Then Return
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
Dim customBindingSource As BindingSource = New BindingSource
Dim orderBindingSource As BindingSource = New BindingSource
Dim detailBindingSource As BindingSource = New BindingSource
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
customBindingSource.DataSource = objDataSet
customBindingSource.DataMember = "Customers"
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
orderBindingSource.DataSource = customBindingSource
orderBindingSource.DataMember = "CustomerOrder"
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
detailBindingSource.DataSource = orderBindingSource
detailBindingSource.DataMember = "OrderDetail"
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
Me.lstCustom.DataSource = customBindingSource
Me.lstCustom.ValueMember = "ContactName"
Me.lstCustom.DisplayMember = "ContactName"
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
Me.DataGridView1.DataSource = orderBindingSource
Me.DataGridView2.DataSource = detailBindingSource
Me.DataGridView1.AutoResizeColumns()
Me.DataGridView2.AutoResizeColumns()
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
Me.txtName.DataBindings.Add("Text", customBindingSource, "ContactName")
Me.txtContactTitle.DataBindings.Add("Text", customBindingSource, "ContactTitle")
Me.txtAddress.DataBindings.Add("Text", customBindingSource, "Address")
Me.txtCity.DataBindings.Add("Text", customBindingSource, "City")
Me.txtRegion.DataBindings.Add("Text", customBindingSource, "Region")
Me.txtPostalCode.DataBindings.Add("Text", customBindingSource, "PostalCode")
Me.txtPhone.DataBindings.Add("Text", customBindingSource, "Phone")
Me.txtFax.DataBindings.Add("Text", customBindingSource, "Fax")
Me.txtCountry.DataBindings.Add("Text", customBindingSource, "Country")
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
End Sub ![](http://p.blog.csdn.net/images/p_blog_csdn_net/fangxinggood/03_BindingResult.gif)
而浏览数据,可以通过BindingManagerBase的Position来控制:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
Private Sub btnFirst_Click()Sub btnFirst_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFirst.Click
'Dim binding As Binding = Me.txtName.DataBindings("Text")
'Dim manager As BindingManagerBase = binding.BindingManagerBase
Dim manager As BindingManagerBase = Me.BindingContext(Me.lstCustom.DataSource)
manager.Position = 0
End Sub
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
Private Sub btnPrev_Click()Sub btnPrev_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrev.Click
Dim manager As BindingManagerBase = Me.BindingContext(Me.lstCustom.DataSource)
If manager.Position > 0 Then
manager.Position -= 1
End If
End Sub
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
Private Sub btnNext_Click()Sub btnNext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNext.Click
Dim manager As BindingManagerBase = Me.BindingContext(Me.lstCustom.DataSource)
If manager.Position < manager.Count - 1 Then
manager.Position += 1
End If
End Sub
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
Private Sub btnLast_Click()Sub btnLast_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLast.Click
Dim manager As BindingManagerBase = Me.BindingContext(Me.lstCustom.DataSource)
manager.Position = manager.Count - 1
End Sub