asp.Net GridView lier objet personnalisé avec Liste imbriquée
J'ai une Liste d'objet personnalisé, qui consistent en une liste personnalisée.
class person{
string name;
int age;
List<friend> allMyFriends;
}
class friend{
string name;
string address;
}
Je'trying de lier une liste de ces objets à un GridView et la Grille doit créer pour chaque ami d'une colonne et d'écrire le nom. Si certaines personnes ont la même frined la grille ne doit pas créer une autre colonne, mais l'utilisation de l'existant. Vous savez ce que je veux dire.
(Les classes sont juste quelques exemples de classes pour simplifier mon cas)
Est-il un moyen de personnaliser dynamiquement la liaison?
Je peux changer les définitions de classe et ainsi de suite, s'ils ont besoin d'hériter de plusieurs interfaces et ainsi de suite.
J'ai googlé beaucoup, mais aucun exemple ne semblait vraiment pour couvrir ce cas.
Pouvait l'utilisation d'un objectSourceControl résoudre mon problème d'une certaine façon?
Mise à jour:
Pour donner plus d'informations:
À la fin j'ai une liste de personnes, tandis que chaque personne de la liste dispose d'une liste d'amis.
List<person> allPerson = new List<person>();
//fill the list
Grid.DataSource = allPerson;
Grid.DataBind()
La table doit avoir des colonnes pour chaque ami et les lignes sont la personne. Lorsqu'une personne a un ami une croix (ou autre) doit être placé dans la grille.
friend1 friend2
x peter
x x adam
Au moment de l'interception de la RowDataBound et depuis la liaison crée uniquement les lignes avec les noms et pas les colonnes, parce que la seule propriété sur ma personne objet est le nom. Est-il un moyen de forcer la liaison de regarder à travers la Liste des Biens dans les objets de la personne et de créer une colonne pour chacun d'eux.
OriginalL'auteur derSteve | 2008-11-17
Vous devez vous connecter pour publier un commentaire.
J'ai été en mesure de résoudre ce à l'aide d'un DataTable que votre source de données pour la Grille. Je n'aime pas l'idée de passer d'un bien propre de l'objet à un DataTable, mais il fournit un support pour la liaison dynamique dont vous avez besoin. J'ai modifié votre ami de l'objet pour avoir un peu de constructeurs. Cela m'a permis de le nettoyage le code statique déclaration, mais pourrait ne pas être nécessaire dans votre mise en œuvre.
L'idée de base est que vous allez étape par tous les amis, ajouter leur nom comme un DataColumn dans un DataTable, puis de remplir les données pour tous les objets de la personne et de leurs amis. Cela pourrait probablement être conçus pour fonctionner dans une seule itération de la allPerson objet, mais j'ai préféré les deux itérations pour rendre le code plus facile à lire.
La solution est écrite en c# 3.5, mais pourrait être converti pour des versions plus anciennes par la modification de la statique de la déclaration de données. J'espère que cette aide.
Edit:
J'ai oublié d'ajouter la façon dont cela est fait.
OriginalL'auteur Chris Porter
Il semble que vous essayez d'afficher une matrice /tableau croisé dans GridView. Vous trouverez peut-être plus facile à saisir votre récupérer vos données dans un format plus compatible. Vous pourriez envisager la rédaction d'une requête analyse croisée si vous utilisez SQL server.
Si vous devez travailler avec les objets dans leur forme actuelle, la Création d'une fusion de liste d'amis avant de commencer pourrait également vous aider en vous fournissant la liste des colonnes. Vous pouvez ensuite lier à chaque colonne à un appel de fonction qui pourrait tenter de trouver la colonne de personne dans les lignes de la liste d'amis.
Pas beau, mais pourrait fonctionner...
OriginalL'auteur HectorMac
Ont un coup d'oeil à ma réponse à une semblable "imbriquée de liaison" question ici.
OriginalL'auteur flesh
Vous pourriez tout aussi bien utiliser le RowDataBound gestionnaire d'événement à ne complexe de liaisons.
OriginalL'auteur sujata
utiliser les éléments suivants :
DataBinder.Eval(Récipient.DataItem,"PPP.PPP")
OriginalL'auteur