找回密码
 立即注册

QQ登录

只需一步,快速开始

xingyuan2010000

高级会员

4

主题

23

帖子

1105

积分

高级会员

积分
1105

活字格认证微信认证勋章元老葡萄

xingyuan2010000
高级会员   /  发表于:2015-4-30 09:30  /   查看:24041  /  回复:24
问题:控件加载数据比较慢,需要较长时间才能将数据展示,有时会导致浏览器出现未响应
说明:1、前台展示样式由excel文件定义,展示时读取excel模版,并向其中添加数据和验证等。
          2、控件展示数据从数据库获取,记录数不定,导致该问题时的数据量为2000多条
          3、跟踪代码发现后台程序从数据库读取数据、控件sheet单元格赋值都挺快,但是之后,就一直等待前台展示了,好久才会出现展示页面,甚至ie会出现停止相应
截图
1、等待前台展示:

正在展示

正在展示


2、展示结果:

展示结果

展示结果
好好学习

24 个回复

倒序浏览
iceman
社区贡献组   /  发表于:2015-4-30 09:54:00
沙发
回复 1楼xingyuan2010000的帖子

您好,
当前数据量建议您使用分页或者按需加载,具体设置方法可以参考在线示例:
分页:http://demo.gcpowertools.com.cn/ ... aging/Overview.aspx
按需:http://demo.gcpowertools.com.cn/ ... emand/Overview.aspx

请尝试看是否启作用,一般影响数据加载性能有两个点,数据量和样式,如果数据量无法减少,可以尝试减少样式。
回复 使用道具 举报
xingyuan2010000
高级会员   /  发表于:2015-4-30 10:02:00
板凳
我看例子都是设置好数据源,然后自动加载的;
但是我们的程序是一次性读取所有的数据,将数据赋值给sheet上的单元格,然后再做展示,这样是不是无法使用您说的方法?
好好学习
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2015-4-30 10:23:00
地板
回复 3楼xingyuan2010000的帖子

我写了一段代码进行了简单的模拟,看是否和你的使用场景一致?

  1. protected void Page_Load(object sender, EventArgs e)
  2.         {
  3.             if (IsPostBack)
  4.             {
  5.                 return;
  6.             }

  7.             DataTable dt = new DataTable();
  8.             dt.Columns.Add("Col1");
  9.             dt.Columns.Add("Col2");
  10.             for (int i = 0; i < 200; i++)
  11.             {
  12.                 dt.Rows.Add("1", "1");
  13.             }

  14.             this.FpSpread1.DataSource = dt;
  15.             SheetView sheet = this.FpSpread1.Sheets[0];
  16.             sheet.AllowLoadOnDemand = true;
  17.             sheet.PageSize = 100;
  18.             sheet.LoadInitRowCount = 10;
  19.             sheet.LoadRowIncrement = 5;
  20.             sheet.LoadOnDemandMode = FarPoint.Web.Spread.LoadOnDemandMode.Background;
  21.             sheet.LoadOnDemandTriggerMode = FarPoint.Web.Spread.LoadOnDemandTriggerMode.Timed;
  22.             sheet.LoadOnDemandInterval = 1000;

  23.             this.FpSpread1.Sheets[0].Rows.Add(0, 1);
  24.             this.FpSpread1.Sheets[0].Cells[0, 0].Text = "测试";
  25.             this.FpSpread1.Sheets[0].AddSpanCell(0, 0, 1, 2);
  26.         }

复制代码


如果没有解决问题,请你把当前模板发上来我查看能否进行优化。
回复 使用道具 举报
xingyuan2010000
高级会员   /  发表于:2015-4-30 10:55:00
5#
回复 4楼iceman的帖子

我先根据您提供的方法测试下
好好学习
回复 使用道具 举报
xingyuan2010000
高级会员   /  发表于:2015-4-30 11:15:00
6#
回复 4楼iceman的帖子

追问下,例如初始化加载100条记录后,是不是只有页面拉到最后才能触发时间事件继续后台加载?
好好学习
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2015-4-30 11:20:00
7#
回复 6楼xingyuan2010000的帖子

当前提供的是按时加载,无法下拉,每个时间间隔都自动加载一批数据。
回复 使用道具 举报
xingyuan2010000
高级会员   /  发表于:2015-5-4 09:24:00
8#
回复 7楼iceman的帖子

我设置了下按需加载,有几个问题
1、需要页面下拉很多才会触发
2、加载时页面没有提示,用户无法知道是否在加载
3、感觉触发时间不准确,设置500,这个是毫秒把,感觉很久才触发
代码如下:
  1.       SheetView sheet = this.fpTemplate.Sheets[0];
  2.                 sheet.AllowLoadOnDemand = true;
  3.                 sheet.PageSize = 5000;
  4.                 sheet.LoadInitRowCount = 100;
  5.                 sheet.LoadRowIncrement = 100;
  6.                 sheet.LoadOnDemandMode = FarPoint.Web.Spread.LoadOnDemandMode.Background;
  7.                 sheet.LoadOnDemandTriggerMode = FarPoint.Web.Spread.LoadOnDemandTriggerMode.Timed;
  8.                 sheet.LoadOnDemandInterval = 100;
复制代码
好好学习
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2015-5-4 13:44:00
9#
回复 8楼xingyuan2010000的帖子

链接中的demo实现了每 1000 毫秒加载一批数据,单位是毫秒,并且在前台实现了数据加载提示。具体的做法是前台添加 label 用于显示。
感觉加载时间不稳定,请问数据是在本地还是远程服务器?有可能是由于网络原因影响的。
后台注册前台加载脚本:

  1. protected void Page_Load(object sender, EventArgs e)
  2.     {
  3.       string js = "var spid='" + FpSpread1.ClientID + "';";
  4.       js += "var ss=document.getElementById(spid);" + "\r\n";
  5.       js += "if (ss.addEventListener) {" + "\r\n";
  6.       js += "    ss.addEventListener("LoadRowsStart", RowStart, false);" + "\r\n";
  7.       js += "    ss.addEventListener("LoadRowsStopped", RowStop, false);" + "\r\n";
  8.       js += "} else {" + "\r\n";
  9.       js += "    ss.onLoadRowsStart = RowStart;" + "\r\n";
  10.       js += "    ss.onLoadRowsStopped = RowStop;" + "\r\n";
  11.       js += "}" + "\r\n";

  12.       ClientScript.RegisterStartupScript(this.GetType(), "onStartUpScript", js, true);
  13. }
复制代码

前台脚本改变label值:

  1. <script type="text/javascript">
  2.     function RowStart() {
  3.       document.getElementById("<%= Label1.ClientID %>").innerHTML = "后台加载数据行...";
  4.     }

  5.     function RowStop(e) {
  6.       var e = e || window.event;
  7.       var rowsToBeLoaded = e.rowsToBeLoaded;
  8.       if (rowsToBeLoaded == 0) {
  9.           document.getElementById("<%= Label1.ClientID %>").innerHTML = "";
  10.       }
  11.       document.getElementById("<%= Label2.ClientID %>").innerHTML = rowsToBeLoaded;
  12.     }
  13.   </script>
复制代码
回复 使用道具 举报
xingyuan2010000
高级会员   /  发表于:2015-5-4 14:36:00
10#
回复 9楼iceman的帖子

嗯,测试可以正常按需加载,但是加载数据大于1000时,显示还是很慢,这个是否可以解决?另外,如果解决不了,我们想使用分页方式,在点击下一页的时候,提示用户正常加载,我在论坛找到了相关例子,但是使用后,可以正常分页,但是点击下一页时无法进行友好提示。获取的按钮都是null

1.png
好好学习
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部