以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  主子表同步加载的问题(oK)  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=60005)

--  作者:HappyFt
--  发布时间:2014/11/16 14:34:00
--  主子表同步加载的问题(oK)

为了提高加载的速度,有主子表的窗口打开时主表按每页50行加载,子表只加载与主表第一行相关联的数据;当主表在切换不同行时再根据切换后的行来加载子表,并且主表若进行筛选后,子表一定要按主表筛选过后得到的第一行数据来同步加载相应的数据。这样加载的代码是应该写在currentchanged事件还是positionchanged事件?还是主表的afterfilter中也要写代码才行?

 

谢谢!

 

 

[此贴子已经被作者于2014-11-16 16:43:38编辑过]

--  作者:有点甜
--  发布时间:2014/11/16 14:36:00
--  
 代码写到positionchanged事件和afterfilter事件,不要写到currentChanged事件
--  作者:HappyFt
--  发布时间:2014/11/16 15:08:00
--  
但那样刚打开窗口后加载主表50行后按主表第一行加载对应的子表行的代码应该写在哪里,在主表的afterload吗?
--  作者:有点甜
--  发布时间:2014/11/16 15:16:00
--  
 是的。
--  作者:HappyFt
--  发布时间:2014/11/16 16:19:00
--  

加载后有一个问题,比如主表加载了9行数据,主表上的第一行是显示的是最先加载的那一行数据,但子表却是显示的主表上的每9行的数据,为什么会这样呢?要怎么办才能实现子表显示最先加载的那行数据的子表?

如下是afterload中的代码:

Dim dr As DataRow
dr = DataTables("dtbSet").Find("winFtbN = \'" & e.DataTable.name & "\' and Rc is Not Null")
If dr IsNot Nothing Then
    Dim MRcol As String = dr("Rc")
    \'查找当前加载表的窗口子表,同步加载其数据
    Dim drs As List(of DataRow) = DataTables("dtbSet").Select("winFtbN = \'" & e.DataTable.name & "\'")
    If drs IsNot Nothing Then
        \'如果主表没数据不加载明细,
        If e.DataTable.DataRows.Count = 0 Then
            For Each dr In drs
                Dim CRcol As String = dr("Rc") \'获取子表关联列
                \'Tables(dr("wintbN")).Cols.Remove(CRcol) \'移除子表关联列不显示
                DataTables(dr("wintbN")).LoadFilter = "[_Identify] < 0 " \'不加载
                DataTables(dr("wintbN")).Load
            Next
        Else  \'遍历加载各个子表
            Dim mdr As DataRow = e.DataTable.DataRows(0)  \'主表第一行
            LockBaseMainForm
            For Each dr In drs
                Dim CRcol As String = dr("Rc") \'获取子表关联列
                Dim sql As String = "Select * from " & dr("tbN") & " where " & CRcol & " = \'" & mdr(MRcol) & "\'"
                DataTables(dr("wintbN")).SQLLoad(sql)
            Next
            UnLockBaseMainForm
        End If
    End If
End If

 

 


--  作者:有点甜
--  发布时间:2014/11/16 16:25:00
--  

 你msgbox看一下,是否还触发了其它,比如 positionChanged 的代码了


--  作者:有点甜
--  发布时间:2014/11/16 16:28:00
--  
 同时 msgbox看一下 mdr(MRcol) 的值
--  作者:HappyFt
--  发布时间:2014/11/16 16:34:00
--  

如果切换行一下数据就正确了,因为positionChanged中的代码起了作用,但刚加载没有切换行时子表显示的数据就对不上主表上第一行,发现了问题:

Dim mdr As DataRow = e.DataTable.DataRows(0)  \'主表第一行

用msgbox(mdr(Rcol)) 显示出来的关联列正好是子表的关联列是正确的,但问题是这一行在加载完成后在主表中实际上是显示在第8行而不是第一行,即分页加载后要得到每页的显示在第一行的那行要怎么办?(在加载后没有任何排序及筛选)


--  作者:有点甜
--  发布时间:2014/11/16 16:38:00
--  
Dim mdr As Row = Tables(e.DataTable.Name).Rows(0)  \'主表第一行
--  作者:HappyFt
--  发布时间:2014/11/16 16:43:00
--  

可以了,加载后主表上当前显示的第一行应该这样获取

Dim pr As Row = Tables(e.DataTable.name).Rows(0)  \'主表第一行

 

谢谢甜老师!