Foxtable(狐表)用户栏目专家坐堂 → 今天决定买开发版!狐表真的不错!


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

主题:今天决定买开发版!狐表真的不错!

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


加好友 发短信
等级:管理员 帖子:47448 积分:251054 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2014/4/14 10:00:00 [显示全部帖子]

楼上,你亏了,下次有个很重要的功能,商业版没有的:

 

 

异步加载数据

 

异步加载数据仅对开发版有效,所以商业版和试用版用户,可以忽略本节内容。

加载数据是需要时间的,特别是网络环境且加载数据量较大的时候,对于用户意味着就是等待,严重影响使用者感受。

不过Foxtable提供了异步加载数据功能,加载数据可以在后台进行,在加载数据的同时,用户可以继续进行其它操作,无需等待。

我们知道DataTable有两个同步加载数据的方法,分别是Load和AppendLoad,对应的也有两个异步加载数据的方法,分别为LoadAsync和AppendLoadAsync。

 

LoadAsync

 

LoadAsync和Load的使用方法完全一样,只是前者是异步加载,后者是同步加载。

 

例如:

DataTables("订单").LoadFilter = "产品 =  'PD01'"
DataTables
("订单").LoadAsync()

 

为了准确地说明异步加载的特性,我们可以在命令窗口测试下面的代码:

 

DataTables("订单").RemoveFor("True") '为了方便测试,先移除所有已经加载的数据,实际应用的时候,不需要如此。
Dim
dt As Date = Date.Now
DataTables
("订单").LoadFilter = "产品 =  'PD01'"
DataTables
("订单").LoadAsync()
Output
.Show("用时:" & (Date.Now - dt).TotalSeconds & "秒")
Output
.Show("目前行数:" & DataTables("订单").DataRows.Count)

 

可以看到用时几乎等于0,而目前行数每次都是等于0,也就是说Foxtable并没有等LoadAsync加载数据完成后就开始执行后续的代码。

当然执行上面的代码,确实会将产品为PD01的所单全部加载进来,那么怎样才能知道数据加载完成了呢,这就需要使用AfterLoad事件了

因为不管是是同步加载还是异步加载,在数据加载完成后,都会触发AfterLoad事件。

利用异步加载的这种特性,我们可以将需要定期加载刷新的表,转移到后台悄悄地执行,而不会对用户日常操作带来"停滞"、"卡"等影响。

但是需要注意,即使是异步加载,也不要太频繁地加载数据,因为我们还需要考虑服务器的承受能力。

 

AppendLoadAsync

 

AppendLoadAsync和AppendLoad的使用方法完全一样,只是前者是异步追载新数据,后者是同步追载新数据。

 

例如:

 

Dim id  As  Integer =  DataTables("订单").Compute("Max(_Identify)")
Dim
Filter As String =  "[_Identify] > " & id
DataTables
("订单").AppendLoadAsync(Filter, False)

 

再例如,设计用户间通讯的时候,如果用AppendLoadAsync代替AppendLoad,用户的感受会更好。

 

用异步加载提高窗口的打开速度

 

如果打开窗口的时候,需要加载大量的数据,那么会需要等待一段时间,才能打开窗口。
我们可以用异步加载来改善这个问题,例如有个SQLTable,将其Select语句定义为:

 

Select * From {订单} Where [_Identify] Is Null

 

然后在窗口的AfterLoad事件加上代码:

 

DataTables("窗口1_Table1").LoadFilter = "" '清除原来的加载条件
DataTables("窗口1_Table1").LoadAsync()

 

这样打开窗口的过程并不会加载数据,而是在窗口打开后再异步加载数据,所以窗口打开的速度会大大提高。

 

异步Fill的实现

 

有点遗憾,Fill并没有对应的异步方法FillAsync,不过变通一下,同样可以实现异步Fill,例如:

 

Tables("窗口1_Table1").Fill("Select * From {订单} Where [_Identify] Is Null","",False)
DataTables("窗口1_Table1").LoadFilter = "" '清除原来的加载条件
DataTables("窗口1_Table1").LoadAsync()

 

原理很简单:Fill只加载表结构,数据交给LoadAsync来异步加载。

[此贴子已经被作者于2014-4-14 10:01:15编辑过]

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


加好友 发短信
等级:管理员 帖子:47448 积分:251054 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2014/4/14 10:57:00 [显示全部帖子]

以下是引用逛逛在2014-4-14 10:54:00的发言:

狐爸,写帮助的时候,觉得还是配合LoadTop  ,先加载个50或100条的,更有吸引力。否则打开时,一条数据也没有,不好看。

 

下次就有了:

 

OpenLoadTree

打开加载树。

语法:

OpenLoadTree(ColNames, Size, PageRows, LoadFistPage, Filter)

ColNames:    指定分组列,不同的列之间用符号"|"隔开,例如“产品|客户”
Size:        可选参数,指定加载树的宽度,如果左停靠区已经有窗口停靠,则此参数无效。
PageRows:     可选参数,指定每页加载的行数,默认为10000。
LoadFistPage:可选参数,打开加载树后,是否自动加载第一页数据。
Filter:      可选参数,设置加载树的生成条件,默认是根据后台所有数据生成加载树的。

[此贴子已经被作者于2014-4-14 10:57:01编辑过]

 回到顶部