【问题标题】:How to filter DataGridView to keep only a given set of rows如何过滤 DataGridView 以仅保留给定的一组行
【发布时间】:2019-05-29 07:18:07
【问题描述】:

C# 中,我通过DataSource 填充了DataGridView。通过一些定制的过滤器,我确定了行的子集(通过循环遍历行并检查列上的条件,准确地说)并且需要在 DatGridView 中仅保留/显示这些行。

我理解的一个选项是遍历网格并隐藏我的索引集之外的行。但是,对于较大的行集,这会非常缓慢。 我的问题是:

给定一个绑定到数据源的 datagridview 及其行的子集,是否有一种有效的方法可以只将这些行保留在 datagridview 中?

【问题讨论】:

  • 速度慢可能仅来自 GUI 更新。您可能想要暂停/恢复布局那些或DoubleBuffer DGV。 - 或者您可以在查询中添加一个指标/过滤器列,您可以在代码中设置它,然后可以在过滤器字符串中设置/取消设置。

标签: c# datagridview datasource


【解决方案1】:

速度慢可能仅来自 GUI 更新。你可能想要

后者将加速包括滚动在内的所有显示操作。


  • 如果您希望使用真正的过滤器,则需要一个额外的列来保存过滤器值和一个BindingSource

(如果您可以将逻辑放入过滤器中,则不需要额外的列..)

假设DataTable DT 作为您的DataSource,首先添加一个过滤列:

DT.Columns.Add("Filter", typeof(int));

接下来创建一个BindingSource BS = new BindingSource();

现在将原始数据源绑定到绑定源并将其用作新数据源:

BS.DataSource = DT;
yourDGV.DataSource  = BS;

现在您可以使用您的代码为过滤器列设置一个值,最后设置或取消设置过滤器:

BS.Filter = "Filter = 23";  // use your indicator logic!
BS.Filter = "";              // unset filter

对于过滤器,您可以使用 DataColumn.Expression 属性syntax

  • 如果您想查看过滤器列,您还需要将其添加到 DGV 列并设置与数据源的连接。

例子:

yourDGV.Columns.Add("Filter", "filter");
yourDGV.Columns["Filter"].DataPropertyName = "Filter";

【讨论】:

  • 感谢您的 cmets。我实际上已经尝试过DoubleBuffer 选项,但没有成功。在我的示例中有 ~24000 行,对于测试,我循环遍历隐藏具有偶数索引的每一行的行。这大约需要 47 秒。有趣的是,控件或 UI 没有明显的闪烁。然后,我尝试对整个网格隐藏设置 visible = false 执行相同操作,耗时 5 秒。将隐藏的网格带入视野又花了大约 30 秒。我会尝试你的其他建议,看看我是否可以得到任何改进。
【解决方案2】:

您如何从代码中填写 Dgv。编写一个 Select 语句来填充一个 DataTable,然后继续将 Datatable 设置为您的 datagridview 的 DS,最后如果您需要过滤,只需调用查询方法,然后它也会调用其他方法。

【讨论】:

  • 感谢您的回复,但call the querying method 是什么意思?就我而言,查询不能转换为简单的选择语句。
  • 不幸的是你必须有一个数据库读取方法,即
  • public datatable readsql(quey){ 把你所有的查询放在这里 把所有的查询结果写入一个DataTable return DataTable; }
  • @ShyamVemula,我看不出我的代码将如何帮助回答这个问题。 DataBinding 是在设计模式下创建的,只需添加一个数据源,并且过滤,正如我所说的是通过网格上的循环,检查用户创建的查询(每列的条件)。它本身没有 SQL。
  • 尝试以编程方式进行,我可以提供帮助
猜你喜欢
  • 2018-07-07
  • 1970-01-01
  • 2019-12-19
  • 1970-01-01
  • 2015-12-06
  • 1970-01-01
  • 1970-01-01
  • 2010-11-20
相关资源
最近更新 更多