Foxtable(狐表)用户栏目专家坐堂 → 取得父节点编号以及节点路径全名


  共有10990人关注过本帖树形打印复制链接

主题:取得父节点编号以及节点路径全名

帅哥哟,离线,有人找我吗?
chnfo
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2243 积分:18477 威望:0 精华:0 注册:2011/11/26 20:21:00
取得父节点编号以及节点路径全名  发帖心情 Post By:2012/7/30 11:55:00 [只看该作者]

在工作中,经常会遇到cpno重名的情况,有时候只看cpno的名称可能会引起误解。
所以,此时需要显示出cpno的全名,也就是包括这个节点的父节点,以及父节点的父节点……的名称,便于识别。

另外,看了一下关于递归的帮助,大致模糊地思考了一下取父节点编号(sortkey)的方法,不知是否可行——也就是遍历所有的sortkey,这个编号从左边开始的字符包括在本行字符串之内且只比本行字符串少一个分隔符(\),但再一想,如果sortkey有上千行,那效率可能会很低。

请高人指点。
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目196.table


 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2012/7/30 12:01:00 [只看该作者]

你要怎么显示? 我没有看明白你的问题。

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2243 积分:18477 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2012/7/31 11:26:00 [只看该作者]

可能是我描述得不够清楚。

是这样的,在文件里,sortkey和cpno这两列是手工直接输入的。
而totalcnpo和FindFather这两列是要通过代码实现的展示结果(我在表中已经手工输入了结果,最终代码执行之后要跟这个结果一致)

比如第二行的sortkey是000\001,cpno是p0101
要求
(1)在totalcpno列里把全称显示出来,即p0101的父节点名称是p0104,那么全称显示应为p0104\p0101
(2)在findfather列里把p0101的父节点的sortkey显示出来,它的父节点的sortkey=000

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2243 积分:18477 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2012/7/31 11:37:00 [只看该作者]

同事,如第6行,sortkey=000\001\001,cpno=p0119

则totalcpno不仅要包括它的父节点(sortkey=000\001)的cpno(p0101),还要包括它的父节点的父节点(sortkey=000)的cpno(p0104),并且用分隔符隔开,也就是它的全名显示为p0104\p0101\p0119

而第6行的父节点的sortkey=000\001

 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2012/7/31 12:05:00 [只看该作者]

很简单,你删除totalcpno和FindFather两列的内容,然后在命令窗口执行下面的代码看看:

 

For Each dr1 As DataRow  In DataTables("data").Select("","sortkey")
    Dim idx As Integer = dr1("sortkey").LastIndexof("\")
    If idx < 0 Then
        dr1("totalcpno") = dr1("cpno")
        dr1("FindFather") = Nothing
    Else
        Dim pkey As String = dr1("sortkey").Substring(0,idx)
        dr1("FindFather") = pkey
        Dim dr2 As DataRow = DataTables("data").Find("sortkey = '" & pkey & "'")
        If dr2 IsNot Nothing
            dr1("totalcpno") = dr2("totalcpno") & "\" & dr1("cpno")
        Else
            dr1("totalcpno") = "输入错误"
        End If
    End If
Next


 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2012/7/31 12:09:00 [只看该作者]

如果你要自动,在DatacolChanged事件设置代码:

 

Select Case e.DataCol.name
    Case "cpno","sortkey"
        Dim dr1 As DataRow = e.DataRow
        Dim idx As Integer = dr1("sortkey").LastIndexof("\")
        If idx < 0 Then
            dr1("totalcpno") = dr1("cpno")
            dr1("FindFather") = Nothing
        Else
            Dim pkey As String = dr1("sortkey").Substring(0,idx)
            dr1("FindFather") = pkey
            Dim dr2 As DataRow = DataTables("data").Find("sortkey = '" & pkey & "'")
            If dr2 IsNot Nothing
                dr1("totalcpno") = dr2("totalcpno") & "\" & dr1("cpno")
            Else
                dr1("totalcpno") = "输入错误"
            End If
        End If
End Select


 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2243 积分:18477 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2012/8/1 15:12:00 [只看该作者]

解决方式巧妙。巧用分隔符来实现,油菜

 回到顶部