以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  筛选后的数据加载到容器ListView后双击提示错误  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=178064)

--  作者:zyxhx
--  发布时间:2022/6/16 15:04:00
--  筛选后的数据加载到容器ListView后双击提示错误
请老师指正:在用ListView容器中显示筛选后的数据,双击选中行或单击修改按钮后提示错误,请问老师如何修改代码?按钮代码如下:

Dim lvw As WinForm.ListView = e.Form.Controls("ListView1")
Dim vr As WinForm.ListViewRow = lvw.Current \'获取ListView的当前行
If vr Is Nothing Then \'如果不存在当前行,也就是内有选定任何一行
    Return
End If
Dim dr As DataRow = vr.tag \'获取此行对应的DataRow
Dim ps As Integer = Tables("高血压糖尿病老年人的随访个体化健康教育活动记录表").FindRow(dr)
If ps >= 0 Then
    Tables("高血压糖尿病老年人的随访个体化健康教育活动记录表").Position = ps
    Forms("慢病随访个体化窗口三").Open
    For Each cl As WinForm.ListViewColumn In lvw.Columns \'逐列更新值
        vr(cl.Name) = dr(cl.Name)
    Next
End If

错误提示如下:
.NET Framework 版本:4.0.30319.42000
Foxtable 版本:2020.4.19.8
错误所在事件:窗口,随访个体化健康教育记录表三,btnEdit,Click
详细错误信息:
无法将类型为“Foxtable.Row”的对象强制转换为类型“Foxtable.DataRow”。

[此贴子已经被作者于2022/6/16 15:07:11编辑过]

--  作者:有点蓝
--  发布时间:2022/6/16 15:06:00
--  
提示什么错误?
--  作者:zyxhx
--  发布时间:2022/6/16 15:08:00
--  
错误提示如下:
.NET Framework 版本:4.0.30319.42000
Foxtable 版本:2020.4.19.8
错误所在事件:窗口,随访个体化健康教育记录表三,btnEdit,Click
详细错误信息:
无法将类型为“Foxtable.Row”的对象强制转换为类型“Foxtable.DataRow”。

--  作者:有点蓝
--  发布时间:2022/6/16 15:12:00
--  
ListView怎么生成的?
--  作者:zyxhx
--  发布时间:2022/6/16 15:19:00
--  
用查询后生成的:
Dim nms() As String = {"xinmin","qsdate","jsdate"}
Dim sps() As String = {"\'","#","#"}
Dim bjf() As String = {" = "," >= "," <= "}
Dim fds() As String = {"姓名","随访时间","随访时间"}
Dim filter As String
For i As Integer = 0 To nms.Length - 1    
    If e.Form.Controls(nms(i)).value IsNot Nothing Then
        If filter > "" Then
            filter =  filter & " and "
        End If
        filter = filter & fds(i) & bjf(i) & sps(i) & e.Form.Controls(nms(i)).value & sps(i)
    End If
Next
If filter > "" Then
    Tables("高血压糖尿病老年人的随访个体化健康教育活动记录表").filter = filter
End If
Dim lvw As WinForm.ListView = e.Form.Controls("ListView1")
lvw.Reset() \'重置ListView,清除所有的分组?列?行和图片.

lvw.View = ViewMode.Details
lvw.Images.AddSmallImage("Man", "Man.ico") \'添加代表男性的图标
lvw.Images.AddSmallImage("Woman", "Woman.ico") \'添加代表女性的图标
Dim cls() As String = {"序号","姓名","性别","年龄","地址","电话","疾病诊断","档案编号","随访时间","随访编号","随访单位","随访图片"} \'定义列名 
Dim wds() As String = {60,60,50,50,100,100,100,150,100,100,100,100} \'定义列宽 
For i As Integer = 0 To  cls.Length - 1  \'增加列 
    Dim c As WinForm.ListViewColumn = lvw.Columns.Add() 
    c.Text = cls(i) \'指定列标题 
    c.Name = cls(i) \'指定列名  
    c.Width = wds(i) \'指定列宽 
Next 
For Each dr As Row In Tables("高血压糖尿病老年人的随访个体化健康教育活动记录表").Rows \'从数据表中提取数据 
    Dim vr As  WinForm.ListViewRow =  lvw.Rows.Add() \'增加一行
    For Each cl As String In cls \'逐列取值
        vr(cl) = dr(cl)
    Next
    If dr("性别") = "男" Then \'设置分组
        vr.ImageKey = "Man"
    Else
        vr.ImageKey = "Woman"
    End If
    vr.Tag= dr \'将DataRow赋值给ListViewRow的Tag属性,将二者联系起来
Next

[此贴子已经被作者于2022/6/16 15:21:01编辑过]

--  作者:有点蓝
--  发布时间:2022/6/16 15:26:00
--  
tag属性绑定的是row,所以使用的时候也必须使用row
For Each dr As Row In Tables("高血压糖尿病老年人的随访个体化健康教育活动记录表").Rows \'从数据表中提取数据 
……
    vr.Tag= dr \'将DataRow赋值给ListViewRow的Tag属性,将二者联系起来
Next

既然是row就没有必要再查一次了
Dim dr As Row = vr.tag \'获取此行对应的DataRow
    Tables("高血压糖尿病老年人的随访个体化健康教育活动记录表").Position = dr.index
    Forms("慢病随访个体化窗口三").Open
    For Each cl As WinForm.ListViewColumn In lvw.Columns \'逐列更新值
        vr(cl.Name) = dr(cl.Name)
    Next


--  作者:zyxhx
--  发布时间:2022/6/16 15:33:00
--  
谢谢老师指正,修改后可以了。
--  作者:zyxhx
--  发布时间:2022/6/16 15:38:00
--  
另外请教一下老师:能不能在容器加载所有datatables数据后再在容器中直接查询:用日期,姓名等进行查询。
--  作者:有点蓝
--  发布时间:2022/6/16 15:58:00
--  
容器指listview?listview没有查询功能,只能遍历所有行,逐行比较判断。
--  作者:zyxhx
--  发布时间:2022/6/16 16:15:00
--  
好的,感谢老师指点。