【问题标题】:DataGridView Filtering Using BindingSource (Of CustomClassObjects)使用 BindingSource(自定义类对象)的 DataGridView 过滤
【发布时间】:2013-08-15 14:15:23
【问题描述】:

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

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


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

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

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

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

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

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

编辑

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

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

【问题讨论】:

  • BindingListView 是什么?
  • 我认为BindingListView 是通用类,所以你必须使用BindingList(Of T)
  • BindingList 类没有实现 IBindingListView 接口。除了BindingSourceDataView 之外,没有多少类可以这样做。我以为 BindingList 做到了,但不幸的是它没有......
  • 对不起 BindingListView(Of T) ?
  • @SriramSakthivel 我编辑了我的问题,现在更清楚了

标签: c# vb.net datagridview bindingsource bindinglist


【解决方案1】:

啊,我现在明白问题所在了。实际上您的数据源不支持过滤。 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

希望对你有帮助

【讨论】:

  • 检查我上面的第一个代码位,这是你的意思吗?我的 BindingSource 的 DataSource 等于 clsBillHeaders 的列表。那么我的DataGridView的数据源就等于BindingSource了。
  • 尝试将元素添加到BindingSource 本身,不要使用List 并将其设置为BindingSource 的数据源。如果您这样做,那么您的基础数据源是List?你看出区别了吗?
  • 我明白了。我刚试过:Dim bSource As New BindingSource,然后使用bSource.Add(item),其中item 是clsBillHeader 类型的对象...因此bSource 的DataSource 为空,但@ 的List 属性中的计数为4069 987654337@ ...但它没有过滤:(
  • 一些有趣的 Sriram ... 我检查了 bSource 的属性,它指出:SupportsFiltering: False ... 如何让我的 BindingSource 对象支持过滤?我还以为是默认的...!
  • 为了让我的 BindingSource 支持过滤,它必须是 IBindingListView 的一部分...不确定如何执行此操作,但无论如何,请 +1 寻求帮助。
【解决方案2】:

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

【讨论】:

  • MoreLinq 有一个方法可以做到这一点:.ToDataTable() 这很好用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-13
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
  • 2019-03-13
  • 1970-01-01
相关资源
最近更新 更多