每列过滤DataGridView,过滤器在列上方可见

时间:2009-08-26 13:49:17

标签: c# .net winforms ado.net

我有一个相当具体的查询 -

我希望能够从数据库中检索数据,将其显示在DataGridView中,并允许用户通过在每列上方输入简单的过滤查询来过滤列。

例如: -

        | Foo   | Bar                 | Baz |
        ------------------------------------|
Filters | > 10  | 1/1/1980 - 1/1/2009 | Boo |
        | 12    | 1/3/1995            | Boo |
        | 99    | 5/12/2005           | Boo |
                     etc.

我认为最能解决这个问题的方法是有两个DataTables,一个作为DataGridView的DataSource(因此我可以让视图自动生成列,而不必编写一大堆样板来插入行我自己),它本身由一行来保存过滤器和它下面的数据库数据,第二行包含数据库数据,可以通过编程方式附加到第一行。

该解决方案的问题在于列被限制为列的类型,例如,这里Foo是整数,Bar是DateTime而Baz是字符串。当尝试在Foo或Bar中输入过滤器文本时,DataGridView会抛出一个错误,指出该单元格不能包含文本。

是否可以让一行包含与表格其余部分的列类型完全分开的类型?

另一种解决方案可能是让文本框位于网格上方,同时添加列,删除,调整大小和用户滚动,但这似乎是一项大量的工作,并且知道WinForms我可能会发现3天这种方法由于一些微妙的WinForms限制而失败。

无法使用的解决方案 - 使用WPF,使用第三方DataGridView(除非可能是具有商业使用许可的OSS DGV)。

目前似乎最好的解决方案可能是将所有数据作为字符串导入数据库数据表(过滤器下面的数据是只读的)。然而,这看起来非常令人震惊。

我错过了一些简单而明显的东西吗?如果能给我一些前进的话,我很高兴被证明是错的! : - )

2 个答案:

答案 0 :(得分:1)

我过去做过这个,这实际上是一个非常有趣的项目。这个想法基本上是从DataGridViewColumnHeaderCell基类继承,并做自己的绘画。我需要花很多时间来解释所涉及的所有内容,但微软的一篇非常好的文章让我开始了。我没有完全按照他们的方式去做,但它让我走上正轨。

http://msdn.microsoft.com/en-us/library/aa480727.aspx

此外,您应该考虑的是DataTable上有一个DataView属性,它是DataView类型。它上面有一个RowFilter属性,可用于过滤掉行。根本不需要两个DataTable。这是一篇关于如何使用RowFilter属性的好文章:

http://msdn.microsoft.com/en-us/library/system.data.dataview.rowfilter.aspx

答案 1 :(得分:0)

我找到了一个非常有用的项目,允许每列直观过滤 - http://www.codeproject.com/KB/grid/DataGridViewFilterPopup.aspx满足我的需求。