17

BindingListをデータソースとしてBindingSourceをフィルタリングしようとしています。BindingSource.Filter ='Text Condition'を試しましたが、機能しませんでした。何も起こらず、画面上のデータは同じままです。しかし、データソースとしてDataSetを使用すると、機能します。BindingSource.Filterプロパティを使用してオブジェクトのリストをフィルタリングすることは可能ですか?

私は次のクラスを持っています:

class Person
        {
            public String Nombre { get; set; }
            public String Apellido { get; set; }
            public int DNI { get; set; }
            public int Edad { get; set; }
            public Decimal Tamano { get; set; }
        }

これは私がそれを使用する方法です:

BindingList<Person> personas = new BindingList<Person> { 
                new Person{ Apellido = "App1", DNI = 3011, Edad = 20, Nombre ="Name1", Tamano = new decimal(1.7)}
                ,new Person{ Apellido = "App2", DNI = 1520, Edad = 30, Nombre ="Name2", Tamano = new decimal(1.5)}
                ,new Person{ Apellido = "App3", DNI = 5654, Edad = 21, Nombre ="Name3", Tamano = new decimal(1.6)}
                ,new Person{ Apellido = "App4", DNI = 778, Edad = 40, Nombre ="Name4", Tamano = new decimal(1.68)}
            };

            BindingSource bs = new BindingSource();
            bs.DataSource = personas;
            grid.DataSource = bs;

            bs.Filter = "Apellido like 'App1'";

これは、がそのようなデータソースをフィルタリングできるかどうかをテストするというアイデアの単なる例です。私は新しいプロジェクトの中で知識を使用します。

pd:可能であれば、BindingSource.Filterを使用できるようにするという考え方です。

4

3 に答える 3

9

http://msdn.microsoft.com/en-us/library/system.windows.forms.bindingsource.filter.aspxによる

インターフェイスを実装する基になるリストのみがIBindingListViewフィルタリングをサポートします。

BindingList<T>は実装されていないようIBindingListViewです-そしてそれは基礎となるリストであるため、コレクションはフィルタリングされません。

BindingSourceクラスは、ジェネリックではありませんが、このインターフェイスを実装しているため、これをペルソナコレクションとして使用してみてください。新しいBindingSourceのデータソースをBindingListに割り当てるだけでは、基になるリストが変更されないため、十分ではないと感じます。試す:

BindingSource personas = new BindingSource { new Person{ ... }, ... };
于 2012-04-09T13:45:07.647 に答える
3

かなり複雑になる可能性のあるIBindingListViewを実装する代わりに、このタイプのフィルタリングを試すことができます。

BindingList<Person> personas = new BindingList<Person> {  
new Person{ Apellido = "App1", DNI = 3011, Edad = 20, Nombre ="Name1", Tamano = new decimal(1.7)} 
,new Person{ Apellido = "App2", DNI = 1520, Edad = 30, Nombre ="Name2", Tamano = new decimal(1.5)} 
,new Person{ Apellido = "App3", DNI = 5654, Edad = 21, Nombre ="Name3", Tamano = new decimal(1.6)} 
,new Person{ Apellido = "App4", DNI = 778, Edad = 40, Nombre ="Name4", Tamano = new decimal(1.68)} 
};

BindingList<Person> filtered = new BindingList<Person>(personas.Where(
                                 p => p.Apellido.Contains("App1")).ToList());
grid.DataSource = filtered;
于 2012-04-09T13:58:45.143 に答える
1

これは、BindingSourceがフィルタリングしているデータの種類を認識していないためだと思います。データがデータセットから列と行に変換されると、フィルターを実行できます。データソースはクラスであるため、自動フィルタリングを実行できません。

于 2012-04-09T13:40:50.293 に答える