Foxtable(狐表)用户栏目专家坐堂 → 请教一个问题


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

主题:请教一个问题

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


加好友 发短信
等级:幼狐 帖子:85 积分:722 威望:0 精华:0 注册:2018/5/2 16:58:00
请教一个问题  发帖心情 Post By:2023/12/14 11:37:00 [只看该作者]

ListView和TreeView之间的互动。
例如,点击人员查询后,在ListView中会自动从内部数据表(表名EI)中筛选出想要显示数据,之后如果点击TreeView目录树里的节点可以进一步筛选出想要的结果。
如果在两个日期里数据日期后,点击查询,查询出的结果在TreeView目录树里的节点也可以进一步筛选出想要的结果。
以上功能能否实现,如果能实现,麻烦给个思路,以及实现的代码大概是怎么样的?主要是TreeView目录树那边的代码,查看了帮助,TreeView目录树是要绑定表的,可我这个是ListView,要如何解决?
图片点击可在新窗口打开查看

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


加好友 发短信
等级:超级版主 帖子:111381 积分:566969 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/12/14 12:05:00 [只看该作者]

查询按钮根据条件重新生成目录树即可:http://www.foxtable.com/webhelp/topics/0893.htm

语法:

BuildTree(DataTableName, Columns, Filter, Sort)

BuildTree(DataTable, Columns, Filter, Sort)


目录树点击事件里重新生成listview,比如原来是遍历所有行【For Each dr As DataRow In DataTables("国家").DataRows】,就改为根据目录树节点生成的条件如For Each dr As DataRow In DataTables("国家").select("国家='" & e.node.text & "'")


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


加好友 发短信
等级:幼狐 帖子:85 积分:722 威望:0 精华:0 注册:2018/5/2 16:58:00
  发帖心情 Post By:2023/12/14 17:34:00 [只看该作者]

图片点击可在新窗口打开查看
Dim Filter As String = ""
If e.Node.Name <> "加载所有行" Then '要用Name属性,不能用Text属性
    Dim lb1 As String = e.Node.DataRow("人员类别")
    Dim zt As String = e.Node.DataRow("人员状态")
    Select Case e.Node.Level
        Case 0
            Filter = "人员类别 = '" & lb1 & "'"
            Dim lvw As WinForm.ListView
            lvw = e.Form.CreateControl("ListView1", ControlTypeEnum.ListView)'设置控件ListView的名称及类型
            lvw.StopRedraw() '停止绘制
            lvw.Groups.Clear() '清除原来的分组
            lvw.Columns.Clear() '清除原来的列
            lvw.Rows.Clear() '清除原来的行
            lvw.Images.Clear() '清除原来的图片
            lvw.Dock = System.Windows.Forms.DockStyle.Fill'设置停靠位置
            lvw.View = ViewMode.Details '显示模式为详细信息
            lvw.TitleSize = New Size(130, 80) '设置平铺区域大小
            lvw.GridLines = True '显示网格线
            lvw.AllowDrag = True '允许拖动行
            lvw.Images.AddImage("Man", "Man.ico", "Man48.ico") '添加代表男性的一对图标,图标键值为“Man”
            lvw.Images.AddImage("Woman", "Woman.ico", "Woman48.ico") '添加代表女性的一对图标,图标键值为“Woman”
            e.Form.Controls("SplitContainer1").Panel2.AddControl(lvw)'创建控件ListView
            Dim cls() As String = {"姓名", "人员类别", "进入单位日期", "离开单位日期", "人员状态"} '定义列名 
            For i As Integer = 0 To cls.Length - 1'增加列   
                Dim c As WinForm.ListViewColumn = lvw.Columns.Add() 
                c.Name = cls(i) '指定列名   
                c.Text = cls(i) '指定标题,这里标题和列名相同
                c.TextAlign = HorizontalAlignment.Center
            Next
            For Each lb As String In DataTables("EI").GetValues("人员类别") '增加分组
                Dim grp As WinForm.ListViewGroup = lvw.Groups.Add()
                grp.Name = lb
                grp.Text = lb
            Next
            For Each dr As DataRow In DataTables("EI").DataRows
                Dim r As WinForm.ListViewRow = lvw.Rows.Add() '增加一行    
                r.Group = dr("人员类别") '指定所属分组
                For Each cl As String In cls '逐列取值
                    r(cl) = dr(cl) 
                Next
                If dr("性别") = "男" Then '设置分组
                    r.ImageKey = "Man"
                Else
                    r.ImageKey = "Woman"
                End If
                r.Tag = dr'将DataRow赋值给ListViewRow的Tag属性,将二者联系起来
            Next
            For Each c As WinForm.ListViewColumn In lvw.Columns
                c.AutoResize
            Next 
            lvw.ShowGroups = False
            lvw.ResumeRedraw() '恢复绘制
        Case 1
            Filter = "人员类别 ='" & lb1 & "' And 人员状态 = '" & zt & "'"
        Case 2
    End Select
End If
DataTables("EI").LoadFilter = Filter
DataTables("EI").Load()
效果是有了,但是感觉不伦不类啊,即使我把代码放在了单击事件,但是每次单击先是表格变化,Listview不变,再单击ListView才会变,是不是我实现的方式方法不对。其次,点击加载所有行,表格变化了,ListView不会变化要怎么解决?
[此贴子已经被作者于2023/12/14 17:34:53编辑过]

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


加好友 发短信
等级:超级版主 帖子:111381 积分:566969 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/12/14 17:38:00 [只看该作者]

把生成ListView的代码放到【DataTables("EI").Load()】之后,先加载数据再生成呀

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


加好友 发短信
等级:幼狐 帖子:85 积分:722 威望:0 精华:0 注册:2018/5/2 16:58:00
  发帖心情 Post By:2023/12/14 17:44:00 [只看该作者]

这个方式之前试过出错,现在又可以了,不知道为什么,谢谢蓝老师指点

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


加好友 发短信
等级:幼狐 帖子:85 积分:722 威望:0 精华:0 注册:2018/5/2 16:58:00
  发帖心情 Post By:2023/12/15 10:00:00 [只看该作者]

以下是引用有点蓝在2023/12/14 12:05:00的发言:
查询按钮根据条件重新生成目录树即可:http://www.foxtable.com/webhelp/topics/0893.htm

语法:

BuildTree(DataTableName, Columns, Filter, Sort)

BuildTree(DataTable, Columns, Filter, Sort)


目录树点击事件里重新生成listview,比如原来是遍历所有行【For Each dr As DataRow In DataTables("国家").DataRows】,就改为根据目录树节点生成的条件如For Each dr As DataRow In DataTables("国家").select("国家='" & e.node.text & "'")

代码中的For Each dr As DataRow In DataTables("EI").DataRows”改成“For Each dr As DataRow In DataTables("EI").select("人员类别='" & e.Node.Name & "'")”后,目录树中只有部分能正常显示,如下图:红色框里的不能正常显示。

图片点击可在新窗口打开查看


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


加好友 发短信
等级:超级版主 帖子:111381 积分:566969 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/12/15 10:02:00 [只看该作者]

没看出来什么地方不正常?

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


加好友 发短信
等级:幼狐 帖子:85 积分:722 威望:0 精华:0 注册:2018/5/2 16:58:00
  发帖心情 Post By:2023/12/15 10:07:00 [只看该作者]

就是点击公辅员或临聘或职员的时候右边是正常能显示出来的,但是点击加载所有行、在聘、调出、退休、在职这些,右边就显示不出来了,代码如下:
Dim Filter As String = ""
If e.Node.Name <> "加载所有行" Then '要用Name属性,不能用Text属性
    Dim lb1 As String = e.Node.DataRow("人员类别")
    Dim zt As String = e.Node.DataRow("人员状态")
    Select Case e.Node.Level
        Case 0
            Filter = "人员类别 = '" & lb1 & "'" 
        Case 1
            Filter = "人员类别 ='" & lb1 & "' And 人员状态 = '" & zt & "'"            
        Case 2
    End Select
End If
DataTables("EI").LoadFilter = Filter
DataTables("EI").Load()
Dim lvw As WinForm.ListView
lvw = e.Form.CreateControl("ListView1", ControlTypeEnum.ListView)'设置控件ListView的名称及类型
lvw.StopRedraw() '停止绘制
lvw.Groups.Clear() '清除原来的分组
lvw.Columns.Clear() '清除原来的列
lvw.Rows.Clear() '清除原来的行
lvw.Images.Clear() '清除原来的图片
lvw.Dock = System.Windows.Forms.DockStyle.Fill '设置停靠位置
lvw.View = ViewMode.Details '显示模式为详细信息
lvw.TitleSize = New Size(130, 80) '设置平铺区域大小
lvw.GridLines = True '显示网格线
lvw.AllowDrag = True '允许拖动行
lvw.Images.AddImage("Man", "Man.ico", "Man48.ico") '添加代表男性的一对图标,图标键值为“Man”
lvw.Images.AddImage("Woman", "Woman.ico", "Woman48.ico") '添加代表女性的一对图标,图标键值为“Woman”
e.Form.Controls("SplitContainer1").Panel2.AddControl(lvw)'创建控件ListView
Dim cls() As String = {"姓名", "人员类别", "进入单位日期", "离开单位日期", "人员状态"} '定义列名 
For i As Integer = 0 To cls.Length - 1'增加列   
    Dim c As WinForm.ListViewColumn = lvw.Columns.Add() 
    c.Name = cls(i) '指定列名   
    c.Text = cls(i) '指定标题,这里标题和列名相同
    c.TextAlign = HorizontalAlignment.Center
Next
For Each lb As String In DataTables("EI").GetValues("人员类别") '增加分组
    Dim grp As WinForm.ListViewGroup = lvw.Groups.Add()
    grp.Name = lb
    grp.Text = lb
Next
For Each dr As DataRow In DataTables("EI").select("人员类别='" & e.Node.Name & "'")
    Dim r As WinForm.ListViewRow = lvw.Rows.Add() '增加一行    
    r.Group = dr("人员类别") '指定所属分组
    For Each cl As String In cls '逐列取值
        r(cl) = dr(cl) 
    Next
    If dr("性别") = "男" Then '设置分组
        r.ImageKey = "Man"
    Else
        r.ImageKey = "Woman"
    End If
    r.Tag = dr'将DataRow赋值给ListViewRow的Tag属性,将二者联系起来
Next
For Each c As WinForm.ListViewColumn In lvw.Columns
    c.AutoResize
Next 
lvw.ShowGroups = False
lvw.ResumeRedraw() '恢复绘制
初步判断是“For Each dr As DataRow In DataTables("EI").select("人员类别='" & e.Node.Name & "'")”这一句没有把人员状态列写进去,不知道怎么写,另外就是加载所有行也不显示,不知是哪里的问题

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


加好友 发短信
等级:超级版主 帖子:111381 积分:566969 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/12/15 10:11:00 [只看该作者]

如果使用的是加载,不是筛选,

For Each dr As DataRow In DataTables("EI").select("人员类别='" & e.Node.Name & "'")
还是改回原来的
For Each dr As DataRow In DataTables("EI").datarows


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


加好友 发短信
等级:幼狐 帖子:85 积分:722 威望:0 精华:0 注册:2018/5/2 16:58:00
  发帖心情 Post By:2023/12/15 10:18:00 [只看该作者]

我是考虑到,查询按钮那边如果重新生成目录树,在点击目录树时执行的还是旧目录树的节点数据,而不是新生成的目录树的节点的数据,如果会受影响,要怎么改

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