楼上,你亏了,下次有个很重要的功能,商业版没有的:
异步加载数据
异步加载数据仅对开发版有效,所以商业版和试用版用户,可以忽略本节内容。
加载数据是需要时间的,特别是网络环境且加载数据量较大的时候,对于用户意味着就是等待,严重影响使用者感受。
不过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编辑过]