Foxtable(狐表)用户栏目专家坐堂 → 用DataList模仿关联表(高性能版本)


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

主题:用DataList模仿关联表(高性能版本)

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


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
用DataList模仿关联表(高性能版本)  发帖心情 Post By:2009/6/17 11:48:00 [显示全部帖子]

之前讲过用Table模仿关联表,但是数据量大的时候,性能很差,不具备实用价值。

现在改用DataList来模拟,需要6月17日更新。


 下载信息  [文件大小:   下载次数: ]
点击浏览该文件:关联的替代.table



我们知道为了提高性能,应该适当控制关联的数量,但是关联表确实给我们带来了很大的便利。
可否鱼和熊掌兼得,既可以得到关联表的好处,又不影响性能呢?可以的,这就是本节要介绍的内容。
可以的,首先请打开示例文件。
在这个文件中,产品表和订单表没有建立关联,但是我们希望能够象已经建立关联一样,在产品表选择一个产品的时候,自动显式该产品的所有订单。


设计步骤:


1、新建一个窗口,窗口类型为停靠,停靠位置为底端。

2、插入一个DataList控件,绑定到订单表,将其停靠属性设为Fill。

3、将DataList的CurrentChanged事件设为:


Dim
dst As WinForm.DataList = e.Form.Controls("DataList1")
If
dst.Current IsNot Nothing Then
    Dim
Index As Integer = Tables("订单").FindRow(dst.Current)
   
If Index >=0 Then
       
Tables("订单").Position = Index
   
End If
End
If


这样我们在DataList控件中选择一行的时候,
Tables("订单")也自动定位到此行,为我们在产品表调用订单表的窗口做准备。


4、窗口的AfterLoad事件设为:


Dim
dst As WinForm.DataList = e.Form.Controls("DataList1")
With
Tables("产品")
    If
.Current Is Nothing Then
        dst.RowFilter =
"False"
   
Else
        dst.RowFilter =
"产品编号 = " & .Current("产品编号")
    End
IF
End
With


5、关闭窗口设计器,回到产品表,打开表属性设置窗口,将其CurrentChanged事件设为:


If
Forms("窗口1").Opened()
   
Dim dst As WinForm.DataList = Forms("窗口1").Controls("DataList1")
   
With CurrentTable
        If
.Current Is Nothing Then
            dst.RowFilter =
"False"
       
Else
            dst.RowFilter =
"产品编号 = " & .Current("产品编号")
       
End IF
    End
With
End
If


现在我们打开窗口1,可以看到在产品表选择一个产品,窗口1中的DataList控件能够自动列出该产品的订单。

DataList没有编辑功能,不过可以直接调用订单表的原窗口来输入数据,你可以在窗口1的DataList控件选择一个订单,然后单击按钮“编辑订单”,即可打开订单表的“编辑订单”窗口修改此选定的订单。之所以能够调用订单表的窗口来编辑DataList中选定的订单,是因为在步骤3中设置的代码,使得在DataList控件中选择一行的时候,Tables("订单")也自动定位到此行。
当然,我们并非一定要调用订单表的窗口来编辑订单,我们完全可以将订单编辑窗口设计在产品表中。


6、
到目前为止,还有一个不足,DataList不能直接增加行,所以需要提供一个“增加订单”的按钮,其代码设为:


Dim
dr As DataRow = DataTables("订单").AddNew()
dr(
"产品编号") = Tables("产品").Current("产品编号")
If
Forms("窗口1").Opened Then
    '在DataList控件中选定新增的行
   
Forms("窗口1").Controls("DataList1").Current = dr
End
If

我们没有必要对关联过于敏感,大多数时候,关联对于性能的影响是可以忽略的,即使有一些影响,也不至于影响我们的日常工作。
所以我们在设计一套系统的时候,首先应该按照常规的方法设计系统,该建立的关联还是应该建立的,而不是考虑上面介绍的这种极端的方法。

[此贴子已经被作者于2009-6-17 12:42:11编辑过]

[本帖被加为精华]
 回到顶部