之前讲过用Table模仿关联表,但是数据量大的时候,性能很差,不具备实用价值。
现在改用DataList来模拟,需要6月17日更新。
我们知道为了提高性能,应该适当控制关联的数量,但是关联表确实给我们带来了很大的便利。
可否鱼和熊掌兼得,既可以得到关联表的好处,又不影响性能呢?可以的,这就是本节要介绍的内容。
可以的,首先请打开示例文件。
在这个文件中,产品表和订单表没有建立关联,但是我们希望能够象已经建立关联一样,在产品表选择一个产品的时候,自动显式该产品的所有订单。
设计步骤:
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编辑过]