Dictionnaire<T> Liste<T>, et ListViews dans ASP.NET
Préambule
Je vous pose cette question parce que même si j'ai lu beaucoup de ListView ressources, je ne suis pas encore 'arriver' il.
Arrière-plan
J'ai un tas de Foo
's qui ont une liste des articles associés (connu comme Bar
), et je suis en tirant de l'Accès aux Données/de la couche Logique Métier comme Dictionnaire qui contient un Foo
et ses associés Bars
. Je voudrais à cracher sur ces articles sur la Page web dans un ListView
qui détient le Foo.Name
sur la gauche, et le List<Bar>
sur la droite dans un dropdownlist. (Illustré avec ma belle ASCII art ci-dessous):
ListView
------------------------------------------------------------------ | Nom De l'objet | DropDownList (de la Liste<T>) | |---------------------------------| _____________________ | | toto1 | | bar1 | v | | | | |_______________|___| | ------------------------------------------------------------------ | | DropDownList (de la Liste<T>) | | | _____________________ | | foo2 | | bar2 | v | | | | |_______________|___| | ------------------------------------------------------------------
Bien, voici ce qu'il se passe. C'est une liste, Les éléments sont tirés à partir d'une base de données dans un Dictionary<Foo, List<Bar>>
. Je vais essayer d'obtenir la Valeur de la Clé du dictionnaire sous le Nom de l'Article", et essaie d'obtenir la Liste des<T>, le " Bar à apparaître comme un DropDownList sur le côté droit de la liste.
Les Diagrammes De Classe
----------------- ----------------- | Foo | Bar | | ----------------- ----------------- | | Id | Nom De L'Élément | | Nom | | ItemValue | | BarID | | | ----------------- -----------------
Donc, pour résumer, je veux placer le Dictionnaire.La clé "Nom" dans le côté gauche de la liste, et le Dictionnaire.Valeur (qui se trouve être une liste) dans un DropdownList sur le côté droit.
De sorte que, pour chaque paire Clé/Valeur, il y en avait un Nom et une liste déroulante qui seraient maison chaque Valeur de Clé.
Mais je suis en cours d'exécution dans les problèmes (évidemment), et je suis en espérant que quelqu'un peut me dire ce que je fais mal.
Code Derrière:
protected Dictionary<Foo, List<Bar>> FooDictionary
{
get;
set;
}
protected void DataBindFooList(List<int> SelectedFoos)
{
System.Web.UI.WebControls.ListView lv = lvFooList;
try
{
Dictionary<Foo, List<Bar>> fooDictionary =
new Dictionary<Foo, List<Bar>>();
foreach (int Foo in SelectedFoos)
{
//Build List of Foos to add as Dictionary.Keys
fooDictionary.Add(fooScalar, Bar)
}
FooDictionary = fooDictionary;
lv.DataSource = FooDictionary;
lv.DataBind();
ddlListOfBars.DataSource = FooDictionary;
ddlListOfBars.DataValueField = "ItemValue";
ddlListOfBars.DataTextField = "ItemName";
ddlListOfBars.DataBind();
}
catch (Exception ex)
{
SetMessage(divFooMsg, "Unable to retrieve Foos: " +
ex.Message, true, true);
}
La Liste De Code:
<asp:ListView ID="lvFooList" runat="server">
<LayoutTemplate>
<asp:PlaceHolder runat="server" ID="itemPlaceholder"></asp:PlaceHolder>
</LayoutTemplate>
<ItemSeparatorTemplate>
<hr />
</ItemSeparatorTemplate>
<ItemTemplate>
<%#Eval("Name") %>
<asp:DropDownList ID="ddlListOfBars" runat="server"></asp:DropDownList>
</ItemTemplate>
</asp:ListView>
La Question(s):
- Est-il possible d'utiliser un Dictionnaire de cette façon?
- Pointeur sur l'endroit où je vais mal? (Des ressources, des conseils, etc. aiderait)
- Est-il une meilleure façon de le faire?
- Si cette question est clair comme de la boue, s'il vous plaît commentaire afin que je puisse comprendre comment l'améliorer.
- +1 pour la question écrite. Je pouvais à peine de trouver quelque chose de hack and slash!
- D'où vient FooDictionary viennent et pourquoi attribuez-vous FooDictionary = fooDictionary; et lv.DataSource = FooDictionary;?
- Manu: Il y a beaucoup de vaudou qui instruction foreach. Essentiellement, il passe à travers et crée un dictionnaire à partir de la Foo et les mesures associées avec qui foo. J'ai juste montré le produit final pour la facilité. Ne devrait pas être la source de données la FooDictionary sorte qu'il peut obtenir le nom?
Vous devez vous connecter pour publier un commentaire.
Votre problème se pose parce qu'il n'a pas de sens à databind ddlListOfBars dans DataBindFooList(), car il n'y a pas juste un DropDownList à databind. Lorsque vous appelez lv.DataBind(), la liste crée une copie de votre ItemTemplate pour chaque Foo, contenant chacun un ddlListOfBars. Vous avez besoin de lui dire de lier chaque DropDownList à la Liste de droite<Barre> comme il va. Vous pouvez le faire en mettant la source de données de ddlListOfBars avec des expressions de liaison de données plutôt que dans le code-behind:
Noter que vous devez également utiliser de la Clé".Nom" pour obtenir le nom de la propriété de votre Foo. Le particulier éléments dans le dictionnaire que vous êtes de liaison sont KeyValuePair<Foo,List<Barre>>, qui a une propriété Clé et une Valeur de propriété pour accéder à la Foo, et la Liste des<Barre> respectivement.
Modifier
Si vous avez beaucoup de choses dans votre ItemTemplate alors il peut être utile de déplacer le contenu dans un contrôle utilisateur. Le contrôle de l'utilisateur peut avoir un typage fort bien à accéder à la DataItem, et a fortement typées l'accès à ses contrôles enfants. Cela vous procure la flexibilité de l'événement ItemDataBound sans le casting et FindControl() de bruit. Je doute que je me donnerais la peine dans ce cas, mais ce serait quelque chose comme
ListViewContents.ascx...
ListViewContents.ascx.cs...
Est quelque chose comme ce que vous souhaitez:
Ensuite, j'ai écrit un très rapide méchant test
Semble faire ce que vous voulez, mais mon code est juste rapide de code de test, alors soyez prévenus. Il n'a rendu comme prévu si.