以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- 请教一个问题 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=189654) |
-- 作者:dhyskyworld -- 发布时间:2023/12/14 11:37:00 -- 请教一个问题 ListView和TreeView之间的互动。 例如,点击人员查询后,在ListView中会自动从内部数据表(表名EI)中筛选出想要显示数据,之后如果点击TreeView目录树里的节点可以进一步筛选出想要的结果。 如果在两个日期里数据日期后,点击查询,查询出的结果在TreeView目录树里的节点也可以进一步筛选出想要的结果。 以上功能能否实现,如果能实现,麻烦给个思路,以及实现的代码大概是怎么样的?主要是TreeView目录树那边的代码,查看了帮助,TreeView目录树是要绑定表的,可我这个是ListView,要如何解决?
|
-- 作者:有点蓝 -- 发布时间: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 -- 发布时间: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编辑过]
|
-- 作者:有点蓝 -- 发布时间:2023/12/14 17:38:00 -- 把生成ListView的代码放到【DataTables("EI").Load()】之后,先加载数据再生成呀 |
-- 作者:dhyskyworld -- 发布时间:2023/12/14 17:44:00 -- 这个方式之前试过出错,现在又可以了,不知道为什么,谢谢蓝老师指点 |
-- 作者:dhyskyworld -- 发布时间: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 & "\'")”后,目录树中只有部分能正常显示,如下图:红色框里的不能正常显示。 |
-- 作者:有点蓝 -- 发布时间:2023/12/15 10:02:00 -- 没看出来什么地方不正常? |
-- 作者:dhyskyworld -- 发布时间: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 & "\'")”这一句没有把人员状态列写进去,不知道怎么写,另外就是加载所有行也不显示,不知是哪里的问题 |
-- 作者:有点蓝 -- 发布时间: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 -- 发布时间:2023/12/15 10:18:00 -- 我是考虑到,查询按钮那边如果重新生成目录树,在点击目录树时执行的还是旧目录树的节点数据,而不是新生成的目录树的节点的数据,如果会受影响,要怎么改 |