递归函数使用实例

一般用户可以忽略本节内容。
系统学习过编程的人,对于递归函数都很熟悉,所谓递归函数,就是函数的自我调用。

Foxtable内部函数也支持递归调用。
如果代码设计不当,出现无限递归,会导致堆栈溢出,使得Foxtbale直接崩溃退出。

本节的内容可以参考CaseStudy目录下的文件: 递归函数.Table

假定有一个表:

要生成下图所示的目录树,各节点的关系由“父键”和“键”两列的值决定:

而且要求双击某个节点,能将此节点及其子节点对应的行全部筛选出来。

设计步骤:

1、在内部函数中新建一个函数,名为AddChildren,代码为:

Dim nd As WinForm.TreeNode = args(0)
Dim
dt As DataTable = args(1)
Dim
drs As List(of DataRow)
drs = dt.
Select("[父键] = '" & nd.name & "'")
For
Each dr As DataRow In drs
   
Dim cd As Winform.TreeNode = nd.Nodes.Add(dr("键"),dr("标题"))
    Functions.Execute(
"AddChildren",cd,dt)

Next

上述代码中,出现了调用AddChildren函数自身的代码(第8行):

Functions.Execute("AddChildren",cd,dt)

这种在函数自己调用自己的情况,就是常说的递归调用。

2、在窗口中加入一个目录树控件和一个按钮,按钮的代码为:

Dim tr As WinForm.TreeView = e.Form.Controls("TreeView1")
Dim
nd As WinForm.TreeNode
Dim
dt As DataTable = DataTables("A")
tr
.StopRedraw()
tr
.Nodes.Clear
tr
.Nodes.Add("全部")
For
Each dr As DataRow In dt.datarows
   
If dr.IsNull("
父键") Then
       
nd = tr.Nodes.Add(dr("
"),dr("标题"))
        Functions.Execute("AddChildren",nd,dt)
    End If

Next

tr
.ResumeRedraw()

单击此按钮,即可根据“父键”和“键”两列的值,生成目录树。

3、最后将目录树的NodeMouseDoubleClick事件代码设置为:

Dim trv As WinForm.TreeView = e.Form.Controls("TreeView1")
Dim
key As String = e.Node.Name
Dim
ids As String
If
key = "全部" Then
    Tables(
"A").Filter = ""
Else
    For Each
nd As WinForm.TreeNode In trv.AllNodes
        Dim
pd As WinForm.TreeNode = nd
        Do
            If
pd.Name = key Then
                If
ids > "" Then
                   
ids= ids &  ","
                End If
               
ids = ids & "'" & nd.name & "'"
                Exit Do
            Else
               
pd = pd.ParentNode
                If
pd Is Nothing Then
                    Exit Do
                End If
            End If
        Loop
    Next
   
Tables("表A").Filter = "键 In (" & ids & ")"
End If

这样要求双击某个节点,即可将此节点及其子节点对应的行全部筛选出来。


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