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

このスクリーンショットでわかるように、これは必要なすべての値を正常に返します。

BindingSource


問題は、何もフィルタリングされないことです...私のJobNumber Like '100%'フィルタリングはまったく行われていないようです。以下に示すように:

望ましくない結果

最初の 2 つの数字だけを取得する必要がありますが、それ以外はすべて返されます...

フィルタリングを使用するために DataView を使用しないのはなぜですか?

さて、DataView を使用すると、SQL テーブルに直接バインドされた DataTable を使用することになります。私のテーブルの一部の値は外部キーであり、整数よりも意味のあるものに変換する必要があります。

例: FK_Author = 1DataTable の値になります。代わりに、SetByReader を使用して に変換しAuthor = "Alex"ます。だからこそ、BindingSource を使いたいのです。

必要なのは、のクラスにバインドされた DataGridView を介してフィルター処理することだけですclsBillHeaders。誰かが同じ問題を抱えていますか?

編集

このスクリーンショットを見てください。どうやらフィルタリングをサポートしていないようです...

NoFilter のサポート

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.aspxおよびhttp://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 に答える