加载较大数据的 GridView 后,页面事件无法触发
Posted
技术标签:
【中文标题】加载较大数据的 GridView 后,页面事件无法触发【英文标题】:Page Events fail to trigger after loading GridView with larger data 【发布时间】:2021-12-22 21:54:19 【问题描述】:我的 ASP.Net Web 应用程序中有一个带有 GridView 控件的页面。页面事件(如 Page_Load)和按钮相关事件(如 Click)以及与网格相关的事件(如 PageIndex changed 事件)在 GridView 加载的数据较少(如小于或等于 1000 行)时按预期触发,但当 GridView 加载时超过 25000+ 条记录的大数据,所有上述事件都无法触发,页面变得无响应。希望获取 25000 多条记录所花费的时间是导致事件失败的原因。请在这方面帮助我,这对我来说确实是一个棘手的问题。
【问题讨论】:
【参考方案1】:好吧,地球上没有人会加载包含 25,000 条记录的数据集,然后尝试分页。我的意思是,如果你每页显示甚至 50 行(已经太多行了?你真的想虐待、仇恨和折磨你的用户吗?)。
每页甚至 50 行?这将导致 500 页!如果用户可以每 2 秒翻页 1 页,那么您谈论的翻页时间要超过 15 分钟,但这没有任何意义。您需要在此处提供某种过滤器。按城市、按地区、按类型或其他。
我的意思是,想想银行机器。它是否首先下载每个帐户,然后询问您要使用哪个帐户?当然不是!
你会做一个互联网搜索,下载整个互联网,然后强迫用户说使用 ctrl-f 吗?当然不是!!!
尝试加载这么多行数据的简单且没有实际用例。
我的意思是,在这 25,000 行中,用户想要查看哪一行?如果只有 10 人访问该网站,那么您提取了 250,000 行,并且到目前为止还没有做任何有用的工作,用户仍然面临着堆积如山的记录。
用户根本不可能处理这么多信息,更糟糕的是,强迫他们翻阅 100 行的页面是零意义的。你必须重新思考这种方法——也许重新思考你对待生活中大多数事情的方法?
您必须首先提出一个非凡的案例和说明,说明您为什么想要、需要并且会这样做?
你能用谷歌搜索你的问题吗?没有!所以你的意思是有 20 多年的帖子、博客、问题,而地球上没有人能解决你的问题?
回答:不,他们没有解决方案,因为没有人这样工作!!!
因此,您需要在此处提示或提供某种搜索/过滤系统。
但是,在某些情况下,您至少想向用户“提示”或“显示”他们的搜索结果存在大量记录。
还要记住,SQL Server 确实有分页选项。实际上,您将(应该)考虑在此处使用服务器端分页。
gridview/listview 等的数据分页器实际上只是一个“方便”选项。但是,既然可以非常快地提取 200 甚至 1000 行,那么数据分页器 THEN 可以让您将这 1000 行分成 10 或 20 个块,例如 20 行。
但是,虽然我想不出有这么多记录需要分页的场景?您可以采用如上所述的 sql 分页。
它是这样工作的:
DECLARE @PageNumber AS INT
DECLARE @RowsOfPage AS INT
SET @PageNumber=2
SET @RowsOfPage=4
SELECT FruitName,Price FROM SampleFruits
ORDER BY Price
OFFSET (@PageNumber-1)*@RowsOfPage ROWS
FETCH NEXT @RowsOfPage ROWS ONLY
换句话说,上面将只返回 4 的数据集,或者说我们可以更改为 20 行。这意味着您一次只能从服务器中提取 20 行,然后只能将 20 行推入网格。
所以,为了解决您的问题,我将转储内置寻呼机,并根据上述概念推出您自己的寻呼机。这样一来,如果您有 500 或 1000 万行,您的网格或其他任何东西都会快速、即时地运行。
所以,作为提示?
我不会加载更多然后说 300,也许 600 行,然后让内置的数据分页器开始工作。超出该数据集大小?您必须花更多时间在提供某种类型的 UI 过滤器上,或者简单地删除内置寻呼机,然后自己滚动。基于上面的 T-SQL,你可以看到构建一个存储过程,然后持久化一个页码,然后放入你自己的下一个/上一个按钮是很容易的。在您的页面加载时,您可以根据您的标准对表格进行计数(*)。毕竟,也许您已经提供了一些搜索条件,也许您的数据表有 10 或 2000 万行。而现在,一个数据库表中的 10 或 2000 万行并没有那么大。
因此,您可以显示总结果数(例如 50,000 行)。但是,如果您一次分页说 20 或 30 行,实际上您一次只能从服务器中提取 20-30 行,而这对于 asp.net 来说是“没有”的。
在一天结束时,不要尝试将 25,000 条记录拉入某个数据集,然后尝试分页该大型数据集 - 它不会很好地工作,并且对于用户(UI ) 的观点,也不是开发者的观点。
因此,我不建议将数据寻呼机用于超过 400-500 行的绝对顶部。之后,您需要推出自己的和用户 sql server 分页,而不是内置的数据分页器 - 它们根本不是也从来没有为分页大型数据集而构建的。
您可以加载最多 200 行,也许是 300 行,然后将该数据集页面设置给用户。在这些行数之后,您需要花费一些时间和精力并制定不同的方法。
【讨论】:
嗨@Albert D. Kallal,感谢您的建议和回复。我已经使用一些过滤器来获取数据,但问题是,当用户从过滤器下拉列表中选择“全部”选项时,这里正在从多个表(16 个表)中获取数据。只有在这种情况下,数据集才会被 25K 条记录超载。我使用 Postgre SQL 作为我的后端。当然,我会应用其他一些技术来过滤掉数据。谢谢。 这里必须要引入某种sql server站点分页。我发布的示例 t-sql 是针对 sql server 的,但毫无疑问,PostGres 也具有此功能。因此,如前所述,您可以使用过滤器,并执行某种“count(*)”来显示记录数,但您不会提取那么多记录。组合框也是如此。它们适用于大约 50 种选择。在那之后,你必须采用不同的 UI(或者冒着糟糕的 UI 的风险,以及用棒球棒殴打你的用户的头 - 这只是卑鄙和折磨他们)。这确实建议你必须滚动您自己的寻呼机。以上是关于加载较大数据的 GridView 后,页面事件无法触发的主要内容,如果未能解决你的问题,请参考以下文章
Yii2 GridView - 将搜索过滤器更改为onchange事件而不是提交
按钮单击事件后 DataTable 不呈现 Gridview
GridView不能添加头布局,并且scrollView与GridView冲突导致一些页面无法融合