【问题标题】:Filter Bound DataGridView by Unbound Column按未绑定列过滤绑定的 DataGridView
【发布时间】:2016-02-07 13:06:31
【问题描述】:

我有一个 DataGridView 绑定到来自 DataSet.xsd 的 DataTable。我通过代码向DataGridView 添加了一个名为_RowString 的附加列。它包含一个由包含在DataTable 的其他列中的所有字符串值组成的字符串,我想使用该列来过滤DataGridView

我的第一种方法是将_RowString 列直接添加到我的DataTable 而不是DataGridView。但这在我需要插入或更新记录时引起了一些问题,因为在DataTable 上添加和计算列会导致 RowState 所有的值 @ 987654332@ rows to be Changed 所以 TableAdapterManager.UpdateAll(DataSet) 方法总是更新所有记录!

我知道我可以像以前一样使用BindingSource 过滤DataGridView

BindingSource.Filter = String.Format("[_RowString] LIKE '%{0}%'", FilterTextBox.Text);

但由于上述原因,我不想将_RowsString 列添加到我的DataTable 对象中。

如何在不使用BindingSource 和/或将_RowString 列添加到我的DataTable 对象的情况下使用_RowString 未绑定列过滤DataGridView

否则,有没有办法在我的DataTable 中添加一列而不更改RowState 的值?

【问题讨论】:

  • 您能否通过将连接的字符串选择到一列中来将过滤列创建为“计算列”,您不会在 datagridview 中显示该列吗?
  • @TaW 你的意思是我是否可以在与 DataSet 中的 DataTable 关联的 SELECT 命令中创建 _RowString 列?
  • 是的,我就是这个意思。由于它不是真正的列,因此无法更新,但我不知道需要做什么(如果有的话)以保持选择可更新,
  • 我还需要更新 _RowString 列,因为 DataGridView 是可编辑的。所以我需要通过调用 TableAdapter 的 Fill 方法来刷新它,每次我 INSERT 或 UPDATE 一条记录。我下周一试试! :-)
  • @TaW 它可以正常工作!请发布您的解决方案,以便我接受!

标签: c# datagridview datatable filtering databound


【解决方案1】:

最简单的方法可能是在 select包含一个虚拟过滤器列。

如果您将“计算列”添加到您的 SQL,使用 Concat 将所有必要的列按正确的顺序放入一个额外的列中,您将在结果集中得到正确的列。

例子:

select *, concat(last_name, ',', first_name) as filterColumn from persons;

作为计算列,它不可更新,如果需要更新表,您必须注意创建正确的 Update 语句。

您可以使DataGridView 列不可见,甚至可以将其删除..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    相关资源
    最近更新 更多