节点与行的关系

如果目录树是通过BuildTreeCreateTreeGenerateTree方法根据某数据表内容自动生成的,那么可以通过节点的DataRow属性,返回此节点在数据表中对应的行。
需要注意的是,一个节点可能对应有多个行,DataRow属性将只返回其中一行。

示例一

我们在上一节已经讲述,要设计一个下图所示的筛选树:

设计步骤为:

1、将窗口的AfterLoad事件设为:

Dim trv As WinForm.TreeView = e.Form.Controls("TreeView1")
trv
.BuildTree("订单", "产品|客户|雇员")
trv
.Nodes.Insert("显示所有行",0)

2、将目录树的NodeMouseDoubleClick事件设为:

Dim Filter As String
Dim
dr As DataRow = e.Node.DataRow '获取生成此节点的行
If
e.Node.Text <> "显示所有行" Then
   
Select Case e.Node.Level
        Case 0
            Filter = "[
产品] = '" & dr("产品") & "'"
        Case 1
            Filter = "[
产品] = '" & dr("产品") & "' And [客户] = '" & dr("客户") & "'"
        Case 2
            Filter = "[
产品] = '" & dr("产品") & "' And [客户] = '" & dr("客户") & "' And [雇员] = '" & dr("雇员") & "'"
    End Select

End
If
Tables
("订单").Filter = Filter

如果不用DataRow属性,则需要直接拆分节点的FullPath,代码为:

Dim Filter As String = ""
Dim
Value() As String
Value
= e.Node.FullPath.Split("\")
If
e.Node.Text <> "显示所有行" Then
    Select Case
e.Node.Level
        Case
0
           
Filter = "[产品] = '" & Value(0) & "'"
        Case
1
           
Filter = "[产品] = '" & Value(0) & "' And [客户] = '" & Value(1) & "'"
        Case
2
           
Filter = "[产品] = '" & Value(0) & "' And [客户] = '" & Value(1) & "' And [雇员] = '" & Value(2) & "'"
   
End Select
End If
Tables(
"订单").Filter = Filter

两段代码的功能一样,但是第二种方法只能获取参与生成目录树的列的值,而第一种方法可以获取任意列的值,而且代码的可读性更好,所以帮助多数时候采用第一种方法。

示例二

假定有下图所示的数据表:

通过下面的代码:

Dim trv As WinForm.TreeView = e.Form.Controls("TreeView1")
trv
.BuildTree("行政区域","省|县市")

生成的目录树是:

如果希望在目录树节点中同时显示出区号和邮编,如下图:

可以将代码改为:

Dim trv As WinForm.TreeView = e.Form.Controls("TreeView1")
trv
.BuildTree("行政区域","|县市")
trv
.StopRedraw '停止绘制目录树
For
Each nd As WinForm.TreeNode In trv.AllNodes '遍历所有节点
    If nd.Level = 1 Then '
如果是二级节点
        nd.Text = nd.text & "|" & nd.DataRow("
区号") & "|" & nd.DataRow("邮编")
   
End If
Next

trv
.ResumeRedraw '恢复绘制目录树

示例三

如果节点和行是一一对应的,那么我们可以在表中快速定位到节点对应的行,例如只需将NodeMouseDoubleClick事件设置为:

Tables("订单").Position = Tables("订单").FindRow(e.Node.DataRow)

这样双击节点,即可快速定位到节点所对应的行。
如果节点和行不是一对多的关系,那么也会定位到其中一个符合条件的行。


本页地址:http://www.foxtable.com/webhelp/topics/2690.htm