Foxtable(狐表)用户栏目专家坐堂 → TabControl的用法请教


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

主题:TabControl的用法请教

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


加好友 发短信
等级:小狐 帖子:371 积分:2672 威望:0 精华:0 注册:2020/7/24 10:30:00
TabControl的用法请教  发帖心情 Post By:2022/5/16 23:50:00 [只看该作者]

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
图片点击可在新窗口打开查看


 回到顶部
帅哥,在线噢!
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110652 积分:563174 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2022/5/17 8:45:00 [只看该作者]

TabControl和表格有什么关系?这个代码想做什么?

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


加好友 发短信
等级:小狐 帖子:371 积分:2672 威望:0 精华:0 注册:2020/7/24 10:30:00
回复:(有点蓝)TabControl和表格有什么关系?这个代...  发帖心情 Post By:2022/5/17 16:26:00 [只看该作者]

我是想达到这样一个效果

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

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

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

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



 回到顶部
帅哥,在线噢!
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110652 积分:563174 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2022/5/17 16:46:00 [只看该作者]

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


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


加好友 发短信
等级:小狐 帖子:371 积分:2672 威望:0 精华:0 注册:2020/7/24 10:30:00
回复:(有点蓝)[upload=zip,listview示例0517.zip]v...  发帖心情 Post By:2022/5/17 18:52: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 [编号] <> " & 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

 回到顶部
帅哥,在线噢!
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110652 积分:563174 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By: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
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:371 积分:2672 威望:0 精华:0 注册:2020/7/24 10:30:00
回复:(有点蓝)建议加一个下划线Select e.DataCol.N...  发帖心情 Post By:2022/5/17 22:18:00 [只看该作者]

有个报错


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

 回到顶部
帅哥,在线噢!
有点蓝
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110652 积分:563174 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By: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
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:371 积分:2672 威望:0 精华:0 注册:2020/7/24 10:30:00
回复:(有点蓝)调试Select e.DataCol.Name  &n...  发帖心情 Post By:2022/5/18 23:43:00 [只看该作者]

老师 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() '恢复绘制


 回到顶部
帅哥,在线噢!
有点蓝
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110652 积分:563174 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By: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


 回到顶部