作为副本的Normal型Table

前面提到,在窗口插入Normal型的Table控件,可以将Table从主界面移到窗口中。
在默认的情况下,Normal型的Table是不能“分身”的,在一个地方出现,就会在另一个地方消失,无法同时出现在主界面或多个窗口中。

基本概述

如果将Normal型Table的“作为副本”属性设为True,将不影响原Table,而是创建一个原Table的副本插入到窗口中,这样同一个Table可以同时出现在主界面或多个窗口中,而且可以各自进行独立的操作,互不影响。

既然副本Table是独立的,所以它必须有自己的名称,这样才能和原Table区分开来,其名称为 :

窗口名称_控件名称

假定副本Table控件的名称为“Table1”,所在窗口的名称为“窗口1”,那么不管其绑定到哪一个表,它的名称都是“窗口1_Table1”,我们可以通过这个名称来引用它 ,例如:

Tables("窗口1_Table1").Filter = "产品 = 'PD01'"

假定此副本Table控件绑定到订单表,那么Tables("窗口1_Table1")的数据就来自于DataTables("订单"),此时DataTables("订单")对应有两个Table, 分别是作为副本的Tables("窗口1_Table1")和作为正本的Tables("订单")

你可以打开这个窗口,然后在命令窗口执行:

MessageBox.Show(Tables("窗口1_Table1").DataTable.Name)
MessageBox
.Show(Tables("订单").DataTable.Name)

可以看到两次显示的都是“订单”,说明Tables("窗口1_Table1")Tables("订单")对应的DataTable都是DataTables("订单")。

副本和正本是基于同一个DataTable但各自独立的Table,可以分别进行操作,例如在窗口的AfterLoad事件加上代码:

Tables("窗口1_Table1").Filter = "日期 = #" & Date.Today & "#"

这样打开窗口后,副本Table显示的是今天的订单。

这个副本Table在打开窗口的时候自动生成,在关闭窗口后自动删除,所以如果窗口1已经关闭,那么执行上述代码是会出错的,因为此时并不存在名为"窗口1_Table1"的Table。

共用事件

首先,在表属性中设置的表事件,对于副本Table一样有效。

例如我们在订单表的PrePareEdit事件设置代码:

e.Cancel = True

那么不管是正本的Tables("订单"),还是副本的Tables("窗口1_Table1"),都将是不可编辑的。

其次, 我们可以在表事件中,通过判断触发事件的Table的名称,可以知道是正本还是副本触发了此事件,这样就可以实现差异化处理。
例如在订单表的PrePareEdit事件设置代码:

Select Case e.Table.Name
    Case
"订单" '主表
       
e.Cancel = True
    Case
"产品.订单"
'关联表
       e.Cancel = False
   
Case "窗口1_Table1" '副本Table
       
If User.Name <> "张经理" Then
            e.Cancel =
True
       
End If
End Select

这样Tables("订单")是不能编辑的,关联表Tables("产品.订单")是可以直接编辑的,而副本Tables("窗口1_Table1")只能张经理编辑。

独立事件

下图中的表事件有些特殊,设计窗口时,你可以为副本Table中单独设置这些表事件的代码:

如果在副本Table没有设置这些表事件,那么在原Table中设置的这些表事件对副本Table一样有效;如果你希望这些事件触发时,副本Table和原Table有不一样的行为,那么就可以给副本Table单独设置这些表事件代码。

副本Table能够将这些常用表事件独立出来设置,会给大家的开发工作带来很多便利。

例如希望在副本Table中双击某行后打开一个窗口,可以将副本Table的DoubleClick事件代码设置为:

e.Cancel = True '禁止进入编辑状态
Forms(
"窗口名").Open()

这样在副本中双击某行即可打开指定的窗口,在正本中双击某行则不会动作。

什么时候使用副本

既然Normal型的Table有副本和非副本(姑且称为正本)之分,那么应该什么时候使用正本,什么时候使用副本呢?
很简单,如果一个表,要同时在多个窗口出现,那么只有使用副本才能实现;如果一个表虽然在多个窗口出现,但不是同时出现,那么全部使用正本就行。
例如一个表,要同时在两个窗口出现,那么一个窗口使用正本,一个窗口使用副本;如果要在三个窗口同时出现,那么一个窗口使用正本,另外两个窗口使用副本即可。
例如一个表,虽然要在三个不同的窗口出现,但是这些窗口永远不会同时打开,那么全部使用正本就行。

提示:只有主表才可以有副本,关联表不可以,如果将一个Table控件绑定到关联表,且作为副本属性设置为True,创建的仍然是主表的副本。


本页地址:http://www.foxtable.com/webhelp/topics/1906.htm