【问题标题】:Limit rows displayed in DataGridView when using DataSource使用 DataSource 时限制 DataGridView 中显示的行
【发布时间】:2015-06-25 10:58:18
【问题描述】:

我有一个包含 10000 多行的 DataTable,由 SQL Server 查询产生。 DataTable 用作 DataGridView 的 DataSource,如下所示(简化代码):

MyBindingSource = New BindingSource(MyDataTable, Nothing)
MyDataGridView.DataSource = MyBindingSource

由于加载需要很长时间,我想以某种方式限制 DataGridView 中显示的行数。

我不能在查询中使用TOP,因为我需要DataTable 中存在的所有数据以供以后过滤,而无需重新设置DataSource (MyBindingSource.Filter = MyFilter)。

另外,我不能使用Filter 属性来限制行数,因为查询结果中没有我可以使用的相关数据。为了解决这个问题,我曾考虑将 TSQL 的 ROW_NUMBER 添加到查询结果 (MyBindingSource.Filter = "[RowNumberField] < 100") 中,但这只有在过滤器中没有使用其他字段时才有效。

有什么想法吗?

【问题讨论】:

  • 我在寻找解决方案时看到了那篇文章,但对于这样一个看似简单的任务来说,它似乎有很多模糊......
  • 你确定“瓶颈”是datagridview而不是你的SQL查询?
  • @Fabio 有一个关于扩展的观点,最终您将在客户端上提取太多记录。尽管该操作比显示网格要快得多。您可以以只读方式拉取表,创建 DataView,添加过滤器,然后将其附加到 DGV。您可能想要搜索“DatagridView Paging” - 不要与作为 ASP Web 控件的 DataGrid 混淆。
  • 查询只需要几秒钟,在DataGridView中显示数据需要更长的时间。当然,这取决于查询返回多少条记录。但我会看看分页。

标签: c# .net vb.net winforms datagridview


【解决方案1】:

这里有两个选项:

  1. 我会简单地使用此technique 对您的所有视图(过滤或未过滤)实现分页,使用 BindingNavigator GUI 控件,该控件使用 BindingSource 对象来识别分页符。

  2. 您还可以使用 OR operator 按多个条件进行过滤,但我看不出这对您当前的方法有何帮助,因为您的行号必须在每次过滤后重新计算,例如[RowNumberField]

您可以做的是将过滤逻辑移动到您的 SQL 查询中,然后始终根据行号仅显示前 X 行(我假设您每次使用 TSQL 的ROW_NUMBER() 动态添加)。

这种方法的优点是您可以在 TSQL 中执行更强大的过滤,并让您的数据源更小。

如果您确实采用这种方法,请小心将您的查询与您的视图逻辑混合在一起 - 我建议您使用 Repository Pattern

【讨论】:

  • 我会尝试实现分页,看看我得到了什么结果。目前正在处理其他事情,但我希望能在几周后恢复。
猜你喜欢
  • 1970-01-01
  • 2013-10-07
  • 2017-04-08
  • 1970-01-01
  • 2014-11-10
  • 2016-09-03
  • 1970-01-01
  • 2018-10-03
  • 2011-08-13
相关资源
最近更新 更多