5

我想过滤我的 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

得到所有()

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

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

绑定源


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

不需要的结果

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

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

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

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

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

编辑

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

无过滤器支持

为什么我的 BindingSource 变量默认有这个?

4

2 回答 2

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

希望这可以帮助

于 2013-08-15T14:58:11.147 回答
2

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

于 2014-02-01T02:21:38.273 回答