我想过滤我的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%'
似乎根本没有过滤 . 如下所示:
我应该得到前两个数字,但它返回其他一切......
Why am I not using DataView to use filtering?
好吧,DataView会让我使用直接绑定到SQL表的DataTable . 我的表中的一些值是外键,需要转换为比整数更有意义的东西 .
例如: FK_Author = 1
将是DataTable中的值 . 相反,我使用我的SetByReader将其转换为 Author = "Alex"
. 这就是我想使用BindingSource的原因 .
我只需要过滤一个绑定到 clsBillHeaders
类的DataGridView . 有没有人有同样的问题?
编辑
看一下这个截图 . 显然它不支持过滤......
为什么我的BindingSource变量默认具有此功能?
2 回答
啊,我现在明白了这个问题 . 实际上您的数据源不支持过滤 . BindingSource.Filter仅在您的数据源实现
IBindingListView
时才有效所以,为了使它工作,你想使用
DataView
出于某种原因尝试使用BindingSource
本身作为数据源 .编辑:这个链接可以帮助我们如何支持过滤http://blogs.msdn.com/b/winformsue/archive/2008/05/19/implementing-filtering-on-the-ibindinglistview.aspx和http://blogs.msdn.com/b/winformsue/archive/2007/12/07/implementing-the-ibindinglistview-for-filtering.aspx
希望这可以帮助
我找到了一个快速简单的解决方案,我只是将List转换为DataTable,这里是链接How to fill a datatable with List<T>