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


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

主题:用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编辑过]

[本帖被加为精华]
 回到顶部
美女呀,离线,留言给我吧!
yangming
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:4109 积分:23338 威望:0 精华:21 注册:2008/9/1 20:07:00
  发帖心情 Post By:2009/6/17 12:00:00 [只看该作者]

沙发,躺下来,慢慢看

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


加好友 发短信
等级:童狐 帖子:252 积分:1355 威望:0 精华:0 注册:2009/4/5 13:06:00
  发帖心情 Post By:2009/6/17 12:07:00 [只看该作者]

变态的用法,偶不喜欢。

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


加好友 发短信 菜鸟中的老鸟
等级:七尾狐 帖子:1486 积分:10064 威望:0 精华:9 注册:2008/11/14 8:54:00
  发帖心情 Post By:2009/6/17 12:38:00 [只看该作者]

学习下下。

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


加好友 发短信
等级:五尾狐 帖子:1181 积分:8108 威望:0 精华:1 注册:2009/1/17 10:52:00
  发帖心情 Post By:2009/6/17 13:47:00 [只看该作者]

如果建立关联,新增定单按钮公式应该怎么改,直接在指定关联表增加一行,
关联表的数量一般在多少个时,为最佳?

[此贴子已经被作者于2009-6-17 13:56:49编辑过]

 回到顶部
美女呀,离线,留言给我吧!
yangming
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:4109 积分:23338 威望:0 精华:21 注册:2008/9/1 20:07:00
  发帖心情 Post By:2009/6/17 13:51:00 [只看该作者]

以下是引用八婺在2009-6-17 12:07:00的发言:
变态的用法,偶不喜欢。

呵呵


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


加好友 发短信 F6
等级:狐精 帖子:3036 积分:19229 威望:0 精华:2 注册:2008/9/1 7:50:00
  发帖心情 Post By:2009/6/17 18:59:00 [只看该作者]

以下是引用狐狸爸爸在2009-6-17 11:48:00的发言:

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

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

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

对于sql server我怎么不觉得,用Table模仿关联表模拟有什么不好之处,可以肯定的是在数据录入修改时,表现优秀。
发挥出Table在数据操控的优秀性能。

还没试过数据查询时的性能,所以不随便批评DataList。

不过,不可以随便否定一个控件的,在特定的环境下,使用相适应的控件,就会取得好的成果。


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


加好友 发短信
等级:幼狐 帖子:147 积分:947 威望:0 精华:0 注册:2009/5/12 9:43:00
  发帖心情 Post By:2009/6/17 19:18:00 [只看该作者]

为了这个效率问题,老六快要走火入魔了!

 回到顶部