提要:在VB6中,常将TreeView用来表示层次数据,但相关的与数据库进行交互的代码,需要大量的采用手工编码;在VB.net中,由于数据绑定功能的加强及语言特性的增强,可以很容易的实现TreeView与层次数据的绑定,本文将首先建立一个继承自TreeView的 dbTreeView,然后用一个单位(部门)的层次数据与dbTreeView进行数据绑定,并提供了与数据库进行交互的代码。
1、从层次数据的表达方式开始
在本例中,部门表(department)中有五个字段,如下表:
字段名
字段
类型说明
ID
自动编号
Key
Code
String
编码
Name
String
名称
PID
Int
父结点的ID
CPtr
boolean
是否有子结点
2、继承自TreeNode的myTreeNode
在myTreeNode中,新增了三个属性,如下表:
属性名
类型
说明
Value
Object
Key
PID
Object
父结点的ID
CPtr
Boolean
是否有子结点
在Init事件中,根据传入的四个参数,设置这三个属性和Text属性。
3、将dbTreeView绑定到数据源
属性名
类型
说明
Datasource
dataview
dbTreeVIew的数据源使用dataview,而不是object
Value
Member
string值成员(数据源[dataview]的列名)
Display
Member
string显示(在Text中)成员
Pid
Member
string父ID成员
CPtr
Member
string是否有子结点
后四个属性对应myTreeNode的value,text,pid,cptr。
相关代码如下:
Protected Property DataSource() As Object
Get
Return mDataView
End Get
Set(ByVal Value As Object)
If Value Is Nothing Then
Else
mDataView = Value
cm = CType(Me.BindingContext(mDataView), CurrencyManager)
UpdateTreeView()
End If
End Set
End Property
Protected Property PidMember() As String
Get
Return mPidMember
End Get
Set(ByVal Value As String)
mPidMember = Value
End Set
End Property
Protected Property DisplayMember() As String
Get
Return Join(mDisplayMember, SplitChar)
End Get
Set(ByVal Value As String)
mDisplayMember = Split(Value, SplitChar)
End Set
End Property
'注意,这几个属性都是保护成员,必须在Init事件中设置:
Public Sub Init(ByVal dispmember As String, ByVal valuemember As String, ByVal pidmember As String, ByVal cptrmember As String, ByVal datasource As DataView)
Me.ValueMember = valuemember
Me.DisplayMember = dispmember
Me.PidMember = pidmember
Me.CPtrMember = cptrmember
Me.DataSource = datasource
'取value最大值,新增时将value+1,保证关健值唯一。
Me.mDataView.Sort = Me.ValueMember
Me.m_MaxID = Me.GetValue(Me.mDataView.Count - 1)
End Sub
设置DisplayMember属性的格式如:字段1;字段2;字段3…,