使用BindingSource(Of CustomClassObjects)进行DataGridView过滤

时间:2013-08-15 14:15:24

标签: c# vb.net datagridview bindingsource bindinglist

我想过滤我的DataGridView数据。我的DataGridView的DataSource绑定到BindingSource。 BindingSource包含来自clsBillHeader类的对象列表。

以下是第一段代码:

Dim bSource As New BindingSource
bSource.DataSource = clsBillHeader.GetAll()
dgvBills.DataSource = bSource
bSource.Filter = "JobNumber Like '100%'" //Filter doesn't actually work

GETALL()

Public Shared Function GetAll() As List(Of clsBillHeader)
    Dim mycn As New SqlConnection(connection)
    Dim mycmd As New SqlCommand("SELECT * FROM Headers", mycn)
    mycn.Open()
    Dim myreader As SqlDataReader = mycmd.ExecuteReader
    Dim myList As New List(Of clsBillHeader)
    While myreader.Read
        Dim item As New clsBillHeader()
        SetByReader(myreader, item) //Sets all values correctly (such as forein keys)
        myList.Add(item)
    End While
    mycn.Close()
    Return myList
End Function

这会成功返回我需要的所有值,如您在此屏幕截图中所示:

BindingSource


问题是它没有过滤任何东西......我的JobNumber Like '100%'似乎根本没有过滤。如下所示:

Unwanted Results

我应该得到前两个数字,但它会返回其他所有数据......

为什么我不使用DataView来使用过滤?

好吧,DataView会让我使用直接绑定到SQL表的DataTable。我的表中的一些值是外键,需要转换为比整数更有意义的东西。

Ex:FK_Author = 1将是DataTable中的值。相反,我使用我的SetByReader将其转换为Author = "Alex"。这就是我想使用BindingSource的原因。

我只需要过滤绑定到clsBillHeaders类的DataGridView。有没有人有同样的问题?

修改

看一下这个截图。显然它不支持过滤......

NoFilter Support

为什么我的BindingSource变量默认具有此功能?

2 个答案:

答案 0 :(得分:4)

啊,我现在明白了这个问题。实际上您的数据源不支持过滤。 BindingSource.Filter仅在您的数据源实现IBindingListView

时才有效
  

只有实现IBindingListView接口的底层列表才支持过滤。

因此,要使其工作,您需要更改基础数据源。如果您由于某种原因不想使用DataView,请尝试使用BindingSource本身作为数据源。

编辑: 愿此链接有助于了解如何支持过滤http://blogs.msdn.com/b/winformsue/archive/2008/05/19/implementing-filtering-on-the-ibindinglistview.aspxhttp://blogs.msdn.com/b/winformsue/archive/2007/12/07/implementing-the-ibindinglistview-for-filtering.aspx

希望这有帮助

答案 1 :(得分:2)

我找到了一个快速而简单的解决方案,我只是将List转换为DataTable,这里是链接 How to fill a datatable with List<T>