| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3628 人关注过本帖, 1 人收藏
标题:今天无意发现解决Grid白屏问题。
取消只看楼主 加入收藏
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
结帖率:98.98%
收藏(1)
已结贴  问题点数:10 回复次数:10 
今天无意发现解决Grid白屏问题。
前段时间,用SQL数据库,在本地测试时,表格没有白屏现象,但通过VPN连接到不同局域网的SQL数据库时,由于网速慢,以前的查询用到表格Grid时,发现有白屏现象。
以前是这样查询的,
sqlexec(nhandle,'select * from sql_table','sql_table')
select * from sql_table into curs  sql_table_tmp readwrite
use in sql_table
select sql_table_tmp
THISFORM.Grid1.RECORDSOURCE=''
THISFORM.Grid1.COLUMNCOUNT = -1
THISFORM.Grid1.RECORDSOURCE=ALIAS()
当重复按查询按钮时,我发现不在同一个局域网时,在查询回来的数据量很大的时候,会出现表格白屏,
今天无意发现,在查询前,先修改表格的数据源,竟然无意解决了这个白屏问题
把以上语句改为。

**清空表格,同时更换数据源,防止查询过程表格出现白屏,没这段会白屏
select * from sql_table_tmp where .f. into curs sql_table_tmp1
select sql_table_tmp1
THISFORM.Grid1.RECORDSOURCE=''
THISFORM.Grid1.COLUMNCOUNT = -1
THISFORM.Grid1.RECORDSOURCE=ALIAS()
thisform.grid1.Refresh

sqlexec(nhandle,'select * from sql_table','sql_table') &&先查询数据到sql_table,不能写的
select * from sql_table into curs  sql_table_tmp readwrite &&把查询数据改为可以写的表去sql_table_tmp
use in sql_table &&关闭临时表
select sql_table_tmp &&表格的数据源sql_table_tmp
THISFORM.Grid1.RECORDSOURCE=''
THISFORM.Grid1.COLUMNCOUNT = -1
THISFORM.Grid1.RECORDSOURCE=ALIAS()
求分享


[此贴子已经被作者于2015-12-13 16:50编辑过]

2015-12-13 13:16
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
以下是引用hu9jj在2015-12-13 15:55:42的发言:

先查询数据,获得有效的临时表之后再更新表格的数据源如何?
我本来就是,先查询,然后在更新表格的数据源,就是会白屏,(我说的白屏,是连接其他内不同局域网的SQL数据库,由于网速慢,也不是慢,就是没局域网快)
由于,查询按钮可以,查询多次,按第1次,按第2次,对表格来说,他的数据源都是同1个表格,“先查询数据,获得有效的临时表之后再更新表格的数据源如何”他的数据源还是同1个名称。。
但我发现,在内网,就不会白屏,我在查询之前,把表格的数据源更换为其他的数据源后,等到查询数据回来了,再更换会来,就不会出现白屏了。。
至于是什么原因,就不知道了。。

2015-12-13 16:46
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
以下是引用sdta在2015-12-13 20:57:07的发言:

及时更新数据源,就不会发生白屏现象

我查询数据后,马上
THISFORM.Grid1.RECORDSOURCE=''
THISFORM.Grid1.COLUMNCOUNT = -1
THISFORM.Grid1.RECORDSOURCE=ALIAS()
还不算及时啊?同样的程序,用本机(内网)的SQL数据库测试,好像看不到白屏现象,不知道是本地SQL数据库读取快,“白屏”闪就过了还是什么,反正看不到。
但用外网的SQL数据库,在读取回来的数据量比较多的时候,就有,明显的白屏现象,如果回来的数据少的时候,没明显白屏。
2015-12-14 08:47
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
以下是引用TonyDeng在2015-12-13 20:13:59的发言:

没有显示内容的控件,应在拥有数据内容之后才可视。这其实就是静态设计与动态设计的区别,即我以前说过的,在设计器拖拉控件设计,属于静态的,但现实情况,是有一些画面内容必须(或应该)在运行时根据需要在适当的时候才显现或消隐,那是动态的,静态设计出来的画面,束缚了动态思维,一旦设计时没有控件属性框,你就不知道在哪里和如何书写动态控制代码。

按T版的说法,怎么处理?还是用我自己说的方法?查询之前,清空数据,更换数据源?
2015-12-14 08:48
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
还能这样的啊。又学到了。
zap in (THISFORM.Grid1.RECORDSOURCE)
select (THISFORM.Grid1.RECORDSOURCE)
2015-12-16 21:07
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
以下是引用liuxingang28在2015-12-21 11:42:26的发言:

对于本例来说,并不是改变 RecordSource 的问题,而是“覆盖”了与 Grid.RecordSource 相关联的表所致。对于这种操作,必须在覆盖前执行 THISFORM.Grid.RecordSource=NULL。

你是说把这3句:
THISFORM.Grid1.RECORDSOURCE=''
THISFORM.Grid1.COLUMNCOUNT = -1
THISFORM.Grid1.RECORDSOURCE=ALIAS()
改为:
THISFORM.Grid.RecordSource=NULL
THISFORM.Grid1.COLUMNCOUNT = -1
THISFORM.Grid1.RECORDSOURCE=ALIAS()
2015-12-21 11:59
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
以下是引用liuxingang28在2015-12-21 13:02:29的发言:

不是,我的意思是在执行 sqlexec(nhandle,'select * from sql_table','sql_table') 之前

我查询回来的结果,不是直接用sql_table表的,因为这个表是不可以修改的,我要转为可以修改的。
比如
THISFORM.Grid1.RECORDSOURCE=NULL  &&加这句?
sqlexec(nhandle,'select * from sql_table','sql_table')
if used("sql_table")
   select * from sql_table into cursor sql_table_tmp READWRITE
   use in sql_table
else
  create cursor sql_table_tmp(bh c(16),.....)
endif
select sql_table_tmp
THISFORM.Grid1.RECORDSOURCE=''  &&难道这句不要?
THISFORM.Grid1.COLUMNCOUNT = -1
THISFORM.Grid1.RECORDSOURCE=ALIAS()
我的GRID数据源,不是直接sql_table,也要先THISFORM.Grid1.RECORDSOURCE=NULL吗?
我这几天,测试,有时候会白屏。有时候不会,不是次次会。。。

[此贴子已经被作者于2015-12-21 13:40编辑过]

2015-12-21 13:31
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
以下是引用hu9jj在2015-12-21 13:46:39的发言:

白屏是因为数据源不存在引起的。什么原因会导致数据源不存在呢,通常是数据源表被关闭引起的,如果表格在运行过程中源表被关闭,表格就会“白屏”。除了直接关闭表的use命令外,pack命令也会关闭表。也就是说在表格的运行过程中不能对数据源的表进行pack、use操作,否则就会引起表格的“白屏”。

我的白屏出现在下面的情况:
1、我SQL2000不在局域网内的机器上;同1个局域网的机器,“好像”没白屏现象。
2、我是通过向日葵的VPN功能,在家里连接到公司的SQL2000上,测试时,才发现有白屏现象,但不是次次有有白屏。以前测试,用本地的SQL2000不会的。
3、我是在从SQL2000查询数据回来的时候才会白屏,在按“查询数据”按钮后,到数据完全回来的过程中出现白屏,等到数据完全回来了,白屏消失,显示正常。
2015-12-21 13:58
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
以下是引用liuxingang28在2015-12-21 16:58:57的发言:

用我说的方法应该可以解决你的问题。首次运行查询后,Grid1.RecordSource 被设置为 sql_table_tmp。再次运行时,select * from sql_table into cursor sql_table_tmp READWRITE 会将 sql_table_tmp 覆盖,因此,在运行此语句前应添加 THISFORM.Grid1.RecordSource=NULL。然后在 Select * From ... 之后添加 THISFORM.Grid1.RecordSource="sql_table_tmp"。

好的,我要找个数据量大的,网络慢的时候,才能测试出来。
要是数据量少,网快的时候,就不白屏的,我昨天测试了好几次,都不出现。
2015-12-21 17:16
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
以下是引用hu9jj在2015-12-21 19:17:09的发言:

将表格的数据源与查询得到的表分离,即表格的数据源用一个自由表,查询得到数据再更新到自由表中(自由表原有的记录可以通过zap命令清除)。

先建立一个临时表?在把查询回来的数据更新到临时表?
create cursor t1(bh c(20),xm c(20)....)
sqlexec(nhandle,'select bh,xm,,,, from sql_table where ....','sql_table')
if used('sql_table')
   select t1
   zap in t1
   append from sql_table &&和append from dbf('sql_table') 有什么不同
   use in sql_table
endif
大概是这样?

[此贴子已经被作者于2015-12-22 15:07编辑过]

2015-12-22 14:06
快速回复:今天无意发现解决Grid白屏问题。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018403 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved