Foxtable(狐表)用户栏目专家坐堂 → [求助]判断不出末级节点


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

主题:[求助]判断不出末级节点

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


加好友 发短信
等级:九尾狐 帖子:2199 积分:18075 威望:0 精华:0 注册:2011/11/26 20:21:00
[求助]判断不出末级节点  发帖心情 Post By:2015/5/9 10:06:00 [只看该作者]

希望通过列C的层级判断是否为末级节点,为什么不行呢?
A表中有两列C(字符),T(逻辑)——用于标识这个节点是否为末级节点

在A表的datacolchanged事件中这样写:
Select Case e.DataCol.Name
    Case "C"
        For Each dr As DataRow In e.DataTable.DataRows
            Dim cs As DataRow = e.DataTable.Find("C like '" & dr("C") & "*'")
            If cs IsNot Nothing Then
                dr("T") = False
            Else
                dr("T") = True
            End If
        Next
End Select

执行之后,结果是这样的。这是为什么呢?初步判断是上面的蓝色字体有问题,请教各位,问题出在哪里?因为传不上附件,考虑只有一个表,直接截取界面了。
示例如下:
C T
01      False
0101 False
010101 False
010102 False
0102 False
0103 False
02 False
0201 False
020101 False
020102 False

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


加好友 发短信
等级:贵宾 帖子:35433 积分:178524 威望:0 精华:3 注册:2013/3/30 16:36:00
  发帖心情 Post By:2015/5/9 10:10:00 [只看该作者]

Select Case e.DataCol.Name
    Case "C"
            Dim cs As DataRow = e.DataTable.Find("C like '" & dr("C") & "*'","C Desc")
            If cs IsNot Nothing Then
                cs("T") = True
            End If
End Select
[此贴子已经被作者于2015/5/9 10:10:14编辑过]

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


加好友 发短信
等级:九尾狐 帖子:2199 积分:18075 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2015/5/9 10:30:00 [只看该作者]

貌似还是有点问题。因为任意一行的修改都可能导致另外的节点成为非末级节点。
所以,我觉得需要遍历。问题是修改之后执行还是有问题

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目12.foxdb



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


加好友 发短信
等级:贵宾 帖子:35433 积分:178524 威望:0 精华:3 注册:2013/3/30 16:36:00
  发帖心情 Post By:2015/5/9 10:44:00 [只看该作者]

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目12.foxdb


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


加好友 发短信
等级:九尾狐 帖子:2199 积分:18075 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2015/5/9 10:55:00 [只看该作者]

重置C列会出错滴,BIN兄。
此行已从表中移除并且没有任何数据。BeginEdit() 将允许在此行中创建新数据
用SQL…………,这个…………

Select Case e.DataCol.Name
    Case "C"
        For Each dr As DataRow In e.DataTable.Datarows  '当C列的值发生变化时,
            Dim cs As DataRow = e.DataTable.Find("C like '" & dr("C") & "*'")  '如果在表中找到C值与当前遍历行相似且以当前遍历行C值开头的行,则说明当前遍历行不是末级节点,否则当前遍历行就是末级节点
            If cs IsNot Nothing Then
                dr("T") = False
            Else
                dr("T") = True
            End If
        Next
End Select

并且,如果我将0102改为01.02,然后把"C like '" & dr("C") & "*'"改为"C like '" & dr("C") & ".*'"
执行重置C列就完全没有问题,可以看到该标记为末级节点的都标记成功。并且修改任意一行的C值,会重新标记所有列的T
[此贴子已经被作者于2015/5/9 10:58:25编辑过]

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


加好友 发短信
等级:贵宾 帖子:35433 积分:178524 威望:0 精华:3 注册:2013/3/30 16:36:00
  发帖心情 Post By:2015/5/9 10:59:00 [只看该作者]

.
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目12.foxdb


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


加好友 发短信
等级:九尾狐 帖子:2199 积分:18075 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2015/5/9 11:02:00 [只看该作者]

01  False
0101 False
010101 True    ‘如果我将第四行修改为01010101,那么这一行应当标记为false才对
01010101 True


这就是我所说的只更新某一行是不行的,某一行的C值改变可能导致其它行成为非末级节点。
[此贴子已经被作者于2015/5/9 11:02:46编辑过]

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


加好友 发短信
等级:贵宾 帖子:35433 积分:178524 威望:0 精华:3 注册:2013/3/30 16:36:00
  发帖心情 Post By:2015/5/9 11:09:00 [只看该作者]

要更新以前的话,除开遍历也没啥好办法,但是遍历数据量大会非常耗时.你要是点个重置列,没个十几分钟我看不行.

如果数据量少,直接肉眼就能看出那个是末端了. 根本无需判断啊.


建议你做个按钮.点击显示当前末端节点,这样效率高.



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


加好友 发短信
等级:九尾狐 帖子:2199 积分:18075 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2015/5/9 11:15:00 [只看该作者]

正常情况下,是直接在EXCEL等中做好了之后,直接复制进来的,一般不会改。
实在是怕用户破坏性操作。

关键问题是,我不太明白为什么运行附件中的D和F表的重置C列,D表会执行,F表不会执行,难道like做判断必须要用分隔符?
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目12.foxdb

[此贴子已经被作者于2015/5/9 11:15:49编辑过]

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


加好友 发短信
等级:贵宾 帖子:35433 积分:178524 威望:0 精华:3 注册:2013/3/30 16:36:00
  发帖心情 Post By:2015/5/9 11:20:00 [只看该作者]

.
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目12 (1).foxdb


 回到顶部
总数 12 1 2 下一页