2009-12-10 6 views
1

Je dois parcourir les propriétés d'un type d'objet personnalisé que je récupère de la base de données et afficher uniquement les colonnes qui contiennent des données. Cela signifie que je ne peux pas simplement lier la liste des objets à la grille de données. Je ne veux pas faire une boucle sur chaque objet et voir si la colonne est vide/vide et déterminer dans l'interface utilisateur pour l'afficher. Ce que je pense est dans ma couche de gestion avant de renvoyer l'objet, je voudrais envoyer un retour IEnumerable avec seulement les colonnes qui devraient être visibles. Ainsi, je pensais utiliser Linq pour Object pour le faire, mais je ne suis pas sûr que ce serait très joli. Est-ce que quelqu'un sait d'une solution que je pourrais utiliser sans une tonne d'instructions IF que je pourrais faire pour vérifier à travers un grand objet (30 colonnes ou plus) pour déterminer ce qui doit être montré ou non.C# type anonyme foreach loop

Foreach (CustomerData customerdata in Customers) 
{ 
    if (!customerdata.address.Equals("")) 
     { 
      dgvCustomerData.Column["Address"].visible = false; 
     } 
     //Continue checking other data columns... 
} 

Je veux éviter tout cela dans l'interface utilisateur et toutes les ... Je FI ai un pet de cerveau sur celui-ci quelqu'un peut me aider?

Merci

Répondre

1

Jetez un oeil à the .NET Reflection Libraries. Vous pouvez utiliser la réflexion pour obtenir toutes les propriétés d'un objet et les parcourir pour savoir si elles sont nulles ou non. Vous pouvez ensuite renvoyer une collection d'objets KeyValuePair où Key = nom de propriété et Value = true/false. Vous utiliserez ensuite les keyvaluepairs pour définir la visibilité de la colonne ...

+0

C'était plus de la solution que je pensais, mais au lieu d'une hashtable, je pensais plutôt à une liste IEnumerable que je pouvais simplement lier à la grille de données. Je vais chercher un peu plus. – Bob

4

Vous pourriez faire ce qui suit pour simplifier un peu

Action<T,string> del = (value,name) => { 
    if (value.Equals("")) { 
    dgvCustomerData.Column[name].Visible = false; 
    } 
}; 
foreach (var data in Customers) { 
    del(data.address,"Address"); 
    del(data.name, "Name"); 
    ... 
} 
+0

Je voudrais retirer ceci de la couche d'interface utilisateur pour que l'interface utilisateur n'ait pas à décider quoi afficher ou non. Cependant, c'était l'approche que je pensais faire en premier lieu. – Bob