以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]代码生成TabControl及其page 并嵌套下一层TabControl  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=102231)

--  作者:blsu33
--  发布时间:2017/6/15 16:37:00
--  [求助]代码生成TabControl及其page 并嵌套下一层TabControl
老师,
    如何代买生成TabControl及其page 并嵌套下一层TabControl,没写过,向您学习一下。
下面的分区面板1是用控件添加的例子,希望能代码生分区面板2中一个和分区面板1相同的控件,结构来自表,不知怎么写?


 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:生成页面.foxdb


[此贴子已经被作者于2017/6/15 16:53:25编辑过]

--  作者:有点色
--  发布时间:2017/6/15 17:51:00
--  

Dim spl As WinForm.SplitContainer = e.Form.Controls("SplitContainer1")
Dim dt As DataTable = DataTables("窗口表")
Dim dic As new Dictionary(of String ,object)
For Each tabname As String In dt.GetValues("所属TabControl名称","","_sortkey")
    Dim tab As WinForm.TabControl
    tab = e.Form.CreateControl(tabname, ControlTypeEnum.tabcontrol)
    tab.Dock = 5
    For Each dr As DataRow In dt.Select("所属TabControl名称 = \'" & tabname & "\'")
        tab.TabPages.Add(dr("page名称"),dr("page名称"))
    Next
    dic.Add(tab.name, tab)
Next

Dim sp As WinForm.SplitContainer = e.Form.Controls("SplitContainer1")

For Each level As String In dt.GetValues("上层", "", "_sortkey")
    Dim fdr As DataRow = dt.find("上层 = \'" & level & "\'")
    If level = "无" Then
        sp.Panel2.AddControl(dic(fdr("所属TabControl名称")))
    Else
        Dim ary() As String = level.replace(" 的Page ", " ").split(" ")
        Dim page = dic(ary(0)).tabpages(ary(1))
        Dim panel As WinForm.panel
        panel = e.Form.CreateControl("pnl_" & page.name, ControlTypeEnum.panel)
        panel.Dock = 5
        panel.AddControl(dic(fdr("所属TabControl名称")))
        page.addcontrol(panel)
    End If
Next

 

你的表结构尽量改一下。


--  作者:blsu33
--  发布时间:2017/6/16 13:31:00
--  
老师, 
   领会了您的代码要点,根据需要,写了一上午还是没有写出来,完全晕菜了,能在给看看嘛。
  附件窗口左面区面板是样子,右面是需要在已有的页面中增加一个不包括一级的部分,代码怎么写呢?
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:生成页面.foxdb



--  作者:有点色
--  发布时间:2017/6/16 14:44:00
--  
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:生成页面.foxdb


--  作者:blsu33
--  发布时间:2017/6/16 15:48:00
--  
老师,
   最末级 加入一个表,表名就是编码规则+编码名称,应该怎么写

Dim tab As WinForm.TabControl = args(0)
Dim dr As DataRow = args(1)
Dim e As object=args(2)
Dim dt As DataTable = dr.DataTable
Dim drs As List(of DataRow) = dt.Select("编码规则 like \'" & dr("编码规则") & "%\' and 编码级次 = \'" & dr("编码级次")+1 & "\'")
If drs.count > 0 Then
    Dim ctab As WinForm.TabControl
    ctab = tab.Form.CreateControl("mytab_" & dr("编码规则"), ControlTypeEnum.tabcontrol)
    ctab.Dock = 5
    Dim panel As WinForm.panel
    panel = tab.Form.CreateControl("mypnl_" & dr("编码规则"), ControlTypeEnum.panel)
    panel.Dock = 5
    panel.AddControl(ctab)
    For Each cdr As DataRow In drs
        Dim p As Winform.TabPage=ctab.TabPages.Add(cdr("编码规则"), cdr("编码名称"))
        Functions.Execute("loop", ctab, cdr)
        If cdr("是否末级")=True Then
            Dim tbl As WinForm.Table
            tbl = e.Form.CreateSQLQuery(cdr("编码规则") & cdr("编码名称"), "Select * F rom {cdr("编码规则") & cdr("编码名称")} where "1=1","")‘这块表达式不让保存,不知为何?
            tbl.SetBounds(10, 50, 600, 400)
            p.AddControl(tbl)
        End If
    Next
    
    tab.TabPages(dr("编码规则")).AddControl(panel)
End If

--  作者:blsu33
--  发布时间:2017/6/16 15:51:00
--  
这样写?也不对 "Select * F rom "{" & cdr("编码规则") & cdr("编码名称") & "}" where "1=1",""
           


 tbl.SetBounds(10, 50, 600, 400) 这块怎么写是在page填满显示


--  作者:有点色
--  发布时间:2017/6/16 16:55:00
--  
Dim tab As WinForm.TabControl = args(0)
Dim dr As DataRow = args(1)
Dim dt As DataTable = dr.DataTable
Dim drs As List(of DataRow) = dt.Select("编码规则 like \'" & dr("编码规则") & "%\' and 编码级次 = \'" & dr("编码级次")+1 & "\'")
If drs.count > 0 Then
    Dim ctab As WinForm.TabControl
    ctab = tab.Form.CreateControl("mytab_" & dr("编码规则"), ControlTypeEnum.tabcontrol)
    ctab.Dock = 5
    Dim panel As WinForm.panel
    panel = tab.Form.CreateControl("mypnl_" & dr("编码规则"), ControlTypeEnum.panel)
    panel.Dock = 5
    panel.AddControl(ctab)
    For Each cdr As DataRow In drs
        ctab.TabPages.Add(cdr("编码规则"), cdr("编码名称"))
        Functions.Execute("loop", ctab, cdr)
    Next
    tab.TabPages(dr("编码规则")).AddControl(panel)
Else
    Dim tbl As WinForm.Table
    tbl = tab.Form.CreateSQLQuery("myTable" & dr("编码规则"), "Select * From {AS001权限编码} where 1=1", "") \'这块表达式不让保存,不知为何?
    tbl.Dock = 5
    tab.TabPages(dr("编码规则")).AddControl(tbl)
End If

--  作者:blsu33
--  发布时间:2017/6/19 10:49:00
--  
老师,
   测试中还存在一个问题
_Locked _Identify _SortKey 这些列在数据库中存在(更改为了外部数据源),上面的例子在调整窗口宽度时,会提示错误

图片点击可在新窗口打开查看此主题相关图片如下:qq图片20170619104554.png
图片点击可在新窗口打开查看

错误提示如下


有关调用实时(JIT)调试而不是此对话框的详细信息,
请参见此消息的结尾。

************** 异常文本 **************
System.NullReferenceException: 未将对象引用设置到对象的实例。
   在 Foxtable.o_O0_oO0.oOo_O_oO(Object A_0, OwnerDrawCellEventArgs A_1, Boolean A_2, Boolean A_3, Boolean& A_4)
   在 Foxtable.o_O0_oO0.oOo_O_oO(Object A_0, OwnerDrawCellEventArgs A_1)
   在 C1.Win.C1FlexGrid.C1FlexGridBase.OnOwnerDrawCell(OwnerDrawCellEventArgs e)
   在 C1.Win.C1FlexGrid.C1FlexGridBase.#gdb(OwnerDrawCellEventArgs #tQ)
   在 C1.Win.C1FlexGrid.C1FlexGridBase.#fdb(Graphics #AA, Int32 #j, Int32 #l, Style #aE, Rectangle #o5, String #gM, Image #Ak)
   在 C1.Win.C1FlexGrid.C1FlexGridBase.DrawCell(Graphics #AA, Int32 #j, Int32 #l, Style #aE, Rectangle #o5, String #gM, Image #Ak, CheckEnum #bdb)
   在 C1.Win.C1FlexGrid.C1FlexGridBase.DrawCell(PaintEventArgs e, Int32 row, Int32 col)
   在 C1.Win.C1FlexGrid.C1FlexGrid.DrawCell(PaintEventArgs e, Int32 row, Int32 col)
   在 C1.Win.C1FlexGrid.C1FlexGrid.DrawRow(PaintEventArgs e, Int32 row)
   在 C1.Win.C1FlexGrid.C1FlexGridBase.#adb(PaintEventArgs #tQ)
   在 C1.Win.C1FlexGrid.C1FlexGridBase.OnPaint(PaintEventArgs e)
   在 System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs)
   在 System.Windows.Forms.Control.WmPaint(Message& m)
   在 System.Windows.Forms.Control.WndProc(Message& m)
   在 C1.Win.C1FlexGrid.Util.BaseControls.ScrollableControl.WndProc(Message& m)
   在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


************** 已加载的程序集 **************
....
----------------------------------------

************** JIT 调试 **************
要启用实时(JIT)调试,
该应用程序或计算机的 .config 文件(machine.config)的 system.windows.forms 节中必须设置
jitDebugging 值。
编译应用程序时还必须启用
调试。

例如: 

<configuration>
    <system.windows.forms jitDebugging="true" />
</configuration>

启用 JIT 调试后,任何无法处理的异常
都将被发送到在此计算机上注册的 JIT 调试器,
而不是由此对话框处理。

--  作者:blsu33
--  发布时间:2017/6/19 10:49:00
--  
找了一下论坛 
http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=62080&skin=0
好像是有类似的问题,但是没看出来有什么问题,劳烦老师在给看下。

--  作者:有点色
--  发布时间:2017/6/19 11:46:00
--  

Dim tab As WinForm.TabControl = args(0)
Dim dr As DataRow = args(1)
Dim dt As DataTable = dr.DataTable
Dim drs As List(of DataRow) = dt.Select("编码规则 like \'" & dr("编码规则") & "%\' and 编码级次 = \'" & dr("编码级次")+1 & "\'")
If drs.count > 0 Then
    Dim ctab As WinForm.TabControl
    ctab = tab.Form.CreateControl("mytab_" & dr("编码规则"), ControlTypeEnum.tabcontrol)
    ctab.Dock = 5
    Dim panel As WinForm.panel
    panel = tab.Form.CreateControl("mypnl_" & dr("编码规则"), ControlTypeEnum.panel)
    panel.Dock = 5
    panel.AddControl(ctab)
    For Each cdr As DataRow In drs
        ctab.TabPages.Add(cdr("编码规则"), cdr("编码名称"))
        Functions.Execute("loop", ctab, cdr)
    Next
    tab.TabPages(dr("编码规则")).AddControl(panel)
Else
    Dim tbl As WinForm.Table
    tbl = tab.Form.CreateSQLQuery("myTable" & dr("编码规则"), "Select * From {AS001权限编码}", "") \'这块表达式不让保存,不知为何?
    tbl.Dock = 5
    tab.Form.addcontrol(tbl)
    tab.TabPages(dr("编码规则")).AddControl(tbl)

End If