【问题标题】:How to display Grid data with 'filtered' binding list如何使用“过滤”绑定列表显示网格数据
【发布时间】:2018-07-15 16:33:28
【问题描述】:

我必须在绑定列表的网格中显示数据

BindingList<ExecutionSummaryData> ExecutionList
grid.DataSource = ExecutionList;

其中ExecutionSummaryData 包含Name, Age, Address 等属性(例如)。

现在通过一个winform,当用户选择某些名称、年龄或其他参数时,我必须从ExecutionList 中选择数据,并且必须将过滤后的数据绑定到我的网格。

  1. 我能否以某种方式将此查询绑定到 ExecutionList,以便每次查询字符串更改时 ExecutionList 都会绑定到网格并显示过滤后的数据?

  2. 我能否将通过过滤器字符串从ExecutionList 检索到的任何子列表绑定到我的网格,并且对于每个过滤器查询更改,它将从ExecutionList 获取数据并相应地显示。

  3. 我不想在每个过滤器上清除数据并将数据重新填充到 ExecutionList,因为该网格将实时更新大约 10-20 百万条记录。

编辑我的要求

请建议在此ExecutionList 上使用 Linq 查询或 Lambda 表达式的语法来获取过滤记录。 过滤器查询将包括条件与多个实体进行比较和从列表中获取 像“

Select * from ExecutionList where name in('N1','N2','N3',,,,'N90')" AND AGE in ('A1','A2','A3',,,,'A90')

请建议我如何实现这一目标?根据回复,我将使用缺少/必需的信息更新我的问题。

谢谢,
阿什

【问题讨论】:

  • 不要拨打DataGridViewa GridViewDataGrid,反之亦然!!这是错误且令人困惑的,因为它们是不同的控件。总是用正确的名字来称呼事物!
  • 10-20 百万条记录 真的吗?听起来很疯狂。我认为您应该重新考虑 dbms 级别的设计和过滤器,而不是将这些数字泵送到客户端。您尝试使用 Filter 属性做什么?您可以在 TextBox 的 TextChanged 事件中更改它..
  • @TaW 注意控制调用。没有 RDBMS 参与其中,因为我正在从 redis(内存数据库)中检索数据并订阅它的频道,在那里我将获得更新和以毫秒为单位的新记录。
  • @AshishJaiswal - 那么为什么不用提供的过滤器从 redis 中检索数据呢?
  • 如果用户一次只能看到 50 条记录,为什么还需要保留 10-20 百万条记录并过滤它们?

标签: c# winforms linq lambda


【解决方案1】:

如果您想从 DataTable 中过滤数据,我建议您使用 DataView

DataView dv = new DataView();
dv = new DataView(parameterDs.Tables[0], "ParameterName = '@" + parameter.Key + "'",string.Empty, DataViewRowState.CurrentRows);

你也可以在 DataView 上使用排序

dv.Sort = "Name";

然后就用

grid.DataSource = dv;

另一种使用 DataView 的方法是为它分配一个查询,如下所示:

DataTable contacts = dataSet.Tables["Contact"];

EnumerableRowCollection<DataRow> query = from contact in contacts.AsEnumerable()
                                         where contact.Field<string>("LastName").StartsWith("S")
                                         orderby contact.Field<string>("LastName"), contact.Field<string>("FirstName")
                                         select contact;

DataView view = query.AsDataView();

bindingSource1.DataSource = view;
dataGridView1.AutoResizeColumns();

或使用 DataView 'RowFilter' 属性:

DataTable contacts = dataSet.Tables["Contact"];

DataView view = contacts.AsDataView();

view.RowFilter = "LastName='Zhu'";

bindingSource1.DataSource = view;
dataGridView1.AutoResizeColumns();

每当您想清除过滤器时,只需写:

view.RowFilter = null; //or String.Empty

您可能想看看herehere 的示例:

【讨论】:

  • 我使用的是 BindingList 而不是 DataTable 或 DataView
  • 绑定列表也有一个枚举器,这应该是一样的
【解决方案2】:

创建一个带有分页的存储过程,并通过您的搜索过滤器并检索几千个日期。或者您可以 IQueryable 以便根据您的过滤器触发查询并检索数据。 “这是评论,不是答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 2019-12-19
    • 2012-07-31
    • 2014-04-26
    • 2020-06-12
    • 1970-01-01
    相关资源
    最近更新 更多