Foxtable(狐表)用户栏目专家坐堂 → 窗口内表格动态添加列很慢,求问原因


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

主题:窗口内表格动态添加列很慢,求问原因

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


加好友 发短信
等级:婴狐 帖子:31 积分:375 威望:0 精华:0 注册:2015/7/23 17:13:00
窗口内表格动态添加列很慢,求问原因  发帖心情 Post By:2016/5/17 9:58:00 [只看该作者]

 前提
1.动态数据源
2.窗口内表类型为SQLTable
3.动态添加列代码为DataTables(tbname).DataCols.add(colname, Gettype(String))
4.开发时使用预览或者窗口命令开窗时速度都可以,整体打开项目时每条DataTables(tbname).DataCols.add(colname, Gettype(String))命令耗时1秒左右


我想在窗口中动态做一张表格,然后加载数据,现在的做法是
1.删除之前的默认数据和默认列
2.动态添加列
3.动态加载数据

如果有什么其他的做法能达到我要是效果也可以

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


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2016/5/17 10:01:00 [只看该作者]


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


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2016/5/17 10:02:00 [只看该作者]

如果是外部表,这样也可以

 

http://www.foxtable.com/help/topics/1279.htm

 


 回到顶部
帅哥,在线噢!
狐狸爸爸
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2016/5/17 10:05:00 [只看该作者]

我测试,如果在窗口的Afterload事件,只需0.01秒:

Dim  dt As Date = Date.now
DataTables("窗口1_Table1").DataCols.add("列名", Gettype(String))
MessageBox.show((Date.now -dt).Totalseconds)

 

如果做个按钮,在打开窗口后单击按钮增加列,也不过0.02秒。

 

所以也许问题在其他方面,用上面的方法,分析时间到底耗费在什么地方,搞不定就做个例子发上来测试。


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


加好友 发短信
等级:婴狐 帖子:31 积分:375 威望:0 精华:0 注册:2015/7/23 17:13:00
  发帖心情 Post By:2016/5/17 10:27:00 [只看该作者]

我在这个新创建表上加了一些事件

比如某列是什么值的时候颜色要标注,当前列变化了要跟着变化等等,所以查询表应该不行吧


现在很尴尬的是工程太大我根本没办法传,然后做测试工程速度都很快,唉

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


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2016/5/17 10:30:00 [只看该作者]

 可以写到全局表事件,然后再创建查询表以后,绑定事件即可啊

 

http://www.foxtable.com/help/topics/0671.htm

 


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


加好友 发短信
等级:婴狐 帖子:31 积分:375 威望:0 精华:0 注册:2015/7/23 17:13:00
  发帖心情 Post By:2016/5/17 10:31:00 [只看该作者]

Dim tbname As String = args(0)
Dim colname As String
Dim coltype As Integer

For i As Integer = 1 To Args.Length - 2
    colname = args(i)
    coltype = args(i+1)
    Dim  dt As Date = Date.now
    Select coltype
        Case 1 '使用String类型
            DataTables(tbname).DataCols.add(colname, Gettype(String))
        Case 2 '使用Date类型
            DataTables(tbname).DataCols.add(colname, Gettype(Date))
        Case 3 '使用Integer类型
            DataTables(tbname).DataCols.add(colname, Gettype(Integer))
        Case 4 '使用备注类型
            DataTables(tbname).DataCols.add(colname, Gettype(String), 255)
    End Select
    i = i + 1

MessageBox.show((Date.now -dt).Totalseconds)
Next




这是我动态添加列的函数


图片点击可在新窗口打开查看图片点击可在新窗口打开查看     这是我的时间打印信息

 回到顶部
帅哥,在线噢!
狐狸爸爸
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2016/5/17 10:33:00 [只看该作者]

如果有事件,可能是因为填充数据的过程中,频繁触发事件导致速度慢,你可以填充过程中暂停事件执行:

http://www.foxtable.com/help/topics/2218.htm

 

这种问题,你要先分析出真正导致速度变慢的代码,才好对症下药,不要凭直觉。
提问的时候,最好贴出完整的代码。

 

另外任何表都可以使用事件,包括零时生成的表:

http://www.foxtable.com/help/topics/0671.htm

 

 

 

[此贴子已经被作者于2016/5/17 10:36:44编辑过]

 回到顶部
帅哥,在线噢!
狐狸爸爸
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2016/5/17 10:36:00 [只看该作者]

如果你要动态增加好多列,0.48秒时正常的时间,这是设计思路问题,不是性能问题。

 

增加列之前可以停止绘制表,会稍微快一些。

DataTables(tbname).StopRedraw

....

DataTables(tbname).ResumeRedraw

 


 回到顶部