2009-09-30 11 views
2

Je crée un contrôle qui devrait être capable de prendre n'importe quel type de liste. Essentiellement le code suivant:Filtrage DataGridView

void BindData(IList list) 
{ 
    BindingSource bs = new BindindSource(); 
    bs.DataSource = list; 
    this.DataGridView.DataSource = bs;  
} 

Maintenant, j'ai une zone de texte que je veux utiliser pour filtrer les données dans ma grille. Je pensais que ce serait aussi simple que de définir la propriété bs.Filter mais apparemment pas. Bs.SupportsFiltering renvoie false également.

Est-ce un problème avec moi en utilisant le IList? Si oui, existe-t-il une autre classe/interface de collection que je peux utiliser pour obtenir le même effet? (Encore une fois, je ne suis pas sûr de ce type est des objets dans la liste.

Répondre

4

ne connaissant pas le type que je suis en train passé, je a donné lieu à filtrer les données à la main. Voici mon extrait de code. il fonctionne bien. Espérons que doesn ne prouve pas être trop lent avec de plus grandes quantités de données. :: Fingers Crossed ::

List<object> filteredData = new List<object>(); 
foreach (object data in this.DataSource) 
{ 
    foreach (var column in this.Columns) 
    { 
     var value = data.GetType().GetProperty(column.Field).GetValue(data,null) 
                  .ToString(); 
     if (value.Contains(this.ddFind.Text)) 
     { 
      filteredData.Add(data); 
      break; 
     } 
    } 
} 

this.ddGrid.DataSource = filteredData; 
0

L'Interface IBindingListView complète les capacités de liaison de données de l'interface IBindingList en ajoutant le support pour le filtrage de la liste.

quelques solutions pour les implémentations de IBindingListView génériques se trouve here.