2017-10-17 25 views
0

J'ai un problème avec le filtrage de mes données dans un BindingSource. Je liste les données dans un DataGridView.Objets de filtre C# avec BindingSource dans DataGridView

class client 
{ 

    public int id { get; set; } 
    public String name { get; set; } 


    public client(String name) 
    { 
     this.name = name; 
     this.id = 0; 
    } 
}  

BindingSource clients = new BindingSource(); 

clients.Add(new client("Test1")); 
clients.Add(new client("Test2")); 

dataGridView_clients.AutoGenerateColumns = false; 
dataGridView_clients.ColumnCount = 2; 

dataGridView_clients.Columns[0].Name = "id"; 
dataGridView_clients.Columns[0].DataPropertyName = "id"; 

dataGridView_clients.Columns[1].Name = "name"; 
dataGridView_clients.Columns[1].DataPropertyName = "name"; 

dataGridView_clients.DataSource = clients_source; 

clients.Filter = string.Format("Name = 'Test1'"); 
dataGridView_clients.Refresh(); 

Qu'est-ce que je fais mal? Le filtre ne fonctionne pas, il est affiché dans les deux derniers clients.

+0

Pouvez-vous expliquer ce que vous entendez par « il est montré dans les deux derniers clients ». Qu'est-ce qui est montré? Qu'attendez-vous? –

+0

J'ai les clients "Test1" et "Test2" dans mon BindingSource. Maintenant, je veux filtrer le nom Test1, mais rien ne se passe. Aussi également essayé avec une BindingList – Sony

Répondre

0

Le problème est dû au fait que BindingSource, par défaut, ne prend pas en charge le filtrage. Si vous déboguez votre code, vous verrez que la propriété SupportsFiltering est false.

enter image description here

Pour résoudre ce problème, vous devez mettre en œuvre un IBindingListView et lier ensuite à votre BindingSource, parce que vous pouvez mettre en œuvre la façon dont le filtre fonctionne.

Vous pouvez suivre les étapes décrites dans cet article pour implémenter le IBindingListView. https://blogs.msdn.microsoft.com/winformsue/2007/12/07/implementing-the-ibindinglistview-for-filtering/

0

Vous pouvez vérifier si votre filtrage gérer source de liaison comme celui-ci

clients.SupportsFiltering.ToString() 

Dans votre cas, le filtrage est pas pris en charge. Pour résoudre ce problème, vous pouvez implémenter l'interface IBindingListView. Voir: Implementing the IBindingListView for filtering

0

Merci pour les réponses les gars! Je vais essayer de construire ce filtre, cela semble très difficile. Y a-t-il peut-être une solution plus simple? Je veux faire un filtre pour la liste des offres des clients.

J'ai deux DataGridViews. Si j'ai maintenant 4 offres appelées "offer_1", "offer_2", "offer_3", et "offer_4", et les offres 1 et 2 sont connectées à mon client_1. Je veux les filtrer si je sélectionne client_1 dans mon premier DataGridView. Je devrais pouvoir programmer ceci avec IBindingListView mais je veux demander d'abord de meilleures solutions.

0

Vous pouvez filtrer une liste avant la liaison de données:

List<client> clients = new List<client> { new client("Test1"), new client("Test2") }; 

List<client> filtered = clients.FindAll(c => c.name == "Test2"); 

dataGridView1.DataSource = filtered;