以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  TabControl的用法请教  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=177300)

--  作者:wukangppbb
--  发布时间:2022/5/16 23:50:00
--  TabControl的用法请教
TabControl以下用法错误,应该怎么修改的?

Dim tb As WinForm.TabControl = e.Form.Controls("TabControl1")
Dim r As Row = Tables("评价程序表").AddNew()
Dim cnt As Integer = DataTables("评价程序表").DataRows.Count \'记录打开窗口前的行数
Forms("评价信息窗口").Open()
If DataTables("评价程序表").DataRows.Count = cnt \'如果新增行已经保存
    Dim vr As WinForm.TabControl = tb.Rows.Add()
    For Each cl As WinForm.TabControlColumn In tb.Columns \'逐列取值
        vr(cl.Name) = r(cl.Name)
    Next
    vr.Tag = r.DataRow 
End If


图片点击可在新窗口打开查看此主题相关图片如下:微信截图_20220516234952.png
图片点击可在新窗口打开查看


--  作者:有点蓝
--  发布时间:2022/5/17 8:45:00
--  
TabControl和表格有什么关系?这个代码想做什么?
--  作者:wukangppbb
--  发布时间:2022/5/17 16:26:00
--  回复:(有点蓝)TabControl和表格有什么关系?这个代...
我是想达到这样一个效果

打开示例十七窗口,假设鼠标位置在第一行,点击“增加培训”记录的时候,打开培训记录的窗口,培训记录的窗口中的“编号”,“部门”,“姓名”按照示例十七窗口所在行自动填充,培训记录按照示例十七窗口的员工编号自动增加一个培训记录编号,比如“1-001”

再次点击“增加培训”记录的时候,培训记录编号变成“1-002”.

这个在帮助文件里面应该参照哪一个?

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:listview示例0517.table



--  作者:有点蓝
--  发布时间:2022/5/17 16:46:00
--  
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:listview示例0517.zip


--  作者:wukangppbb
--  发布时间:2022/5/17 18:52:00
--  回复:(有点蓝)[upload=zip,listview示例0517.zip]v...
谢谢老师
但是我设置的这个“培训记录编号”自动编号,无法自动编号,麻烦帮忙看看。
Select e.DataCol.Name
    Case "编号"
        If e.DataRow.IsNull("编号") Then
            e.DataRow("培训记录编号") = Nothing
        Else
            Dim bh As String = e.DataRow("编号")
            If e.DataRow("培训记录编号").StartsWith(bh) = False \'如果单据编号前缀不符
                Dim max As String
                Dim idx As Integer
                max = e.DataTable.Compute("Max(培训记录编号)","编号 = \'" & bh & "\' And [编号] <> " & e.DataRow("编号")) \'取得该类别的最大编号
                If max > "" Then \'如果存在最大编号
                    idx = CInt(max.Substring(1,3)) + 1 \'获得最大编号的后三位顺序号,并加1
                Else
                    idx = 1 \'否则顺序号等于1
                End If
                e.DataRow("培训记录编号") = bh & Format(idx,"000")
            End If
        End If
End Select

--  作者:有点蓝
--  发布时间:2022/5/17 20:21:00
--  
建议加一个下划线

Select e.DataCol.Name
    Case "编号"
        If e.DataRow.IsNull("编号") Then
            e.DataRow("培训记录编号") = Nothing
        Else
            Dim bh As String = e.DataRow("编号")
            If e.DataRow("培训记录编号").StartsWith(bh & “_”) = False \'如果单据编号前缀不符
                Dim max As String
                Dim idx As Integer
                max = e.DataTable.Compute("Max(培训记录编号)","编号 = \'" & bh & "\' And [_identify] <> " & e.DataRow("_identify")) \'取得该类别的最大编号
                If max > "" Then \'如果存在最大编号
                    idx = CInt(max.Substring(max.length - 3)) + 1 \'获得最大编号的后三位顺序号,并加1
                Else
                    idx = 1 \'否则顺序号等于1
                End If
                e.DataRow("培训记录编号") = bh & "_" & Format(idx,"000")
            End If
        End If
End Select

--  作者:wukangppbb
--  发布时间:2022/5/17 22:18:00
--  回复:(有点蓝)建议加一个下划线Select e.DataCol.N...
有个报错


.NET Framework 版本:4.0.30319.42000
Foxtable 版本:2022.1.30.2
错误所在事件:表,培训记录,DataColChanged
详细错误信息:
调用的目标发生了异常。
StartIndex 不能小于 0。
参数名: startIndex

--  作者:有点蓝
--  发布时间:2022/5/17 22:24:00
--  
调试

Select e.DataCol.Name
    Case "编号"
        If e.DataRow.IsNull("编号") Then
            e.DataRow("培训记录编号") = Nothing
        Else
            Dim bh As String = e.DataRow("编号")
msgbox("bh=" & bh)
            If e.DataRow("培训记录编号").StartsWith(bh & “_”) = False \'如果单据编号前缀不符
                Dim max As String
                Dim idx As Integer
                max = e.DataTable.Compute("Max(培训记录编号)","编号 = \'" & bh & "\' And [_identify] <> " & e.DataRow("_identify")) \'取得该类别的最大编号
msgbox("max =" & max )
                If max > "" Then \'如果存在最大编号
msgbox("Substring=" & max.Substring(max.length - 3))
                    idx = CInt(max.Substring(max.length - 3)) + 1 \'获得最大编号的后三位顺序号,并加1
                Else
                    idx = 1 \'否则顺序号等于1
                End If
msgbox("idx =" & idx )
                e.DataRow("培训记录编号") = bh & "_" & Format(idx,"000")
            End If
        End If
End Select

--  作者:wukangppbb
--  发布时间:2022/5/18 23:43:00
--  回复:(有点蓝)调试Select e.DataCol.Name  &n...

老师 AfterLoad  里面可以写两个 listview的 加载代码吗?


我写的下面这个有报错:列“任务编号”不属于表 评价程序表。


Dim lvw As WinForm.ListView = e.Form.Controls("ListView1")

lvw.Columns.Clear() \'清除原来的列

lvw.Rows.Clear() \'清除原来的行

lvw.Images.Clear() \'清除原来的图片

lvw.GridLines = True \'显示网格线

lvw.MultiSelect = False \'禁止按Ctrl多选

\'lvw.CheckBoxes = True \'显示复选框

lvw.View = ViewMode.Details \'显示模式为详细信息

Dim cls() As String = {"任务编号","任务名称","评价年度","评价单位"} \'指定要显示的各列

Dim wds() As Integer = {"100","100","100","200"} \'定义列宽

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.Width = wds(i) \'指定列宽

Next

For Each dr As DataRow In DataTables("内部控制评价任务清单").DataRows \'从数据表中提取数据

    Dim r As  WinForm.ListViewRow =  lvw.Rows.Add() \'增加一行

    For Each cl As String In cls \'逐列取值

        r(cl) = dr(cl)

    Next

Next

lvw.ResumeRedraw() \'恢复绘制



Dim lvw2 As WinForm.ListView = e.Form.Controls("ListView2")

lvw2.Columns.Clear() \'清除原来的列

lvw2.Rows.Clear() \'清除原来的行

lvw2.Images.Clear() \'清除原来的图片

lvw2.GridLines = True \'显示网格线

lvw2.MultiSelect = False \'禁止按Ctrl多选

\'lvw.CheckBoxes = True \'显示复选框

lvw2.View = ViewMode.Details \'显示模式为详细信息

Dim cls2() As String = {"评价任务编号","模块涉及的流程","主责部门","测试人"} \'指定要显示的各列

Dim wds2() As Integer = {"100","100","100","200"} \'定义列宽

For i2 As Integer = 0 To  cls2.Length - 1

    Dim c2 As WinForm.ListViewColumn = lvw2.Columns.Add()

    c2.Name = cls2(i2) \'指定列名

    c2.Text = cls2(i2)\'指定列标题

    c2.Width = wds2(i2) \'指定列宽

Next

For Each dr2 As DataRow In DataTables("评价程序表").DataRows \'从数据表中提取数据

    Dim r2 As  WinForm.ListViewRow =  lvw2.Rows.Add() \'增加一行

    For Each cl2 As String In cls \'逐列取值

        r2(cl2) = dr2(cl2)

    Next

Next

lvw.ResumeRedraw() \'恢复绘制


--  作者:有点蓝
--  发布时间:2022/5/19 8:56:00
--  
提示很明显了

For Each dr2 As DataRow In DataTables("评价程序表").DataRows \'从数据表中提取数据

    Dim r2 As  WinForm.ListViewRow =  lvw2.Rows.Add() \'增加一行

    For Each cl2 As String In cls2 \'逐列取值

        r2(cl2) = dr2(cl2)

    Next

Next