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 |

