2008-10-20 6 views
9

Quel type de collection dois-je utiliser pour convertir la collection NameValue en liaison avec GridView? Lorsque vous le faites directement, cela n'a pas fonctionné.Lier NameValueCollection à GridView?

code dans aspx.cs

private void BindList(NameValueCollection nvpList) 
    { 
    resultGV.DataSource = list; 
    resultGV.DataBind(); 
    } 

code dans ASPX

<asp:GridView ID="resultGV" runat="server" AutoGenerateColumns="False" Width="100%"> 
    <Columns> 
     <asp:BoundField DataField="Key" HeaderText="Key" /> 
     <asp:BoundField DataField="Value" HeaderText="Value" /> 
    </Columns> 
</asp:GridView> 

Toute pointe les bienvenus. Merci. X.

Répondre

8

Pouvez-vous utiliser le dictionnaire < chaîne, chaîne > au lieu de NameValueCollection. Depuis Dictionnaire < T, T > implémente IEnumerable vous pouvez utiliser LINQ comme ceci:

resultGV.DataSource = from item in nvpDictionary 
         select new { Key = item.Key, Value = item.Value }; 
resultGV.DataBind(); 

[EDIT] En fait, vous pourrez peut-être utiliser le dictionnaire directement:

resultGV.DataSource = nvpDictionary; 
resultGV.DataBind(); 

Si elle ne correspond pas clé/valeur comme vous le souhaitez, vous pouvez toujours revenir à LINQ. LINQ vous permettrait également de renommer les champs pour ce que vous voulez. [EDIT] Si vous ne pouvez pas modifier l'utilisation du dictionnaire < T, T >, faites une copie de NameValueCollection en tant que dictionnaire dans la méthode et liez-la. Si vous faites cela souvent, vous pouvez écrire une méthode d'extension pour convertir en dictionnaire, et l'utiliser ainsi.

public static class NameValueCollectionExtensions 
{ 
    public static Dictionary<string,string> ToDictionary(this NameValueCollection collection) 
    { 
     Dictionary<string,string> temp = new Dictionary<string,string>(); 
     foreach (string key in collection) 
     { 
      temp.Add(key,collection[key]); 
     } 
     return temp; 
    } 
} 

private void BindList(NameValueCollection nvpList) 
{ 
    resultGV.DataSource = nvpList.ToDictionary(); 
    resultGV.DataBind(); 
} 
+0

Je ne peux pas le changer en dictionnaire car c'est un objet ext et j'utilise toujours Net 2.0. Mais merci quand même. Chaque opinion aide. –

+0

Gardez à l'esprit que NameValueCollection peut avoir des clés en double, alors que Dictionary ne le fait pas. Ainsi, vous pourriez rencontrer des problèmes/perdre des informations lors de la conversion en dictionnaire. – magnattic

2

Enfin, j'ai utilisé la solution suggérée dans votre implémentation d'extension, mais sans l'extension elle-même. Peut-être faire une classe d'aide qui sera statique et faire la traduction pour moi dans un endroit au lieu de beaucoup. Cette extension est assez pratique ... :-)

Merci. X.

6

C'est un peu difficile, car le enumerator renvoie uniquement les clés. Mais, vous pouvez obtenir la valeur de clé avec Container.DataItem, puis regarder dans NameValueCollection pour obtenir la valeur:

<asp:GridView id="gv" runat="server" AutoGenerateColumns="false"> 
    <Columns> 
     <asp:TemplateField HeaderText="Key"> 
     <ItemTemplate><%# Container.DataItem %></ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Value"> 
     <ItemTemplate> 
      <%# ((NameValueCollection)gv.DataSource)[(string)Container.DataItem] %> 
     </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 
+0

Voir ma réponse pour un changement nécessaire si vous utilisez un contrôle imbriqué DataBound Repeater imbriqué avec NameValueCollection –

1

Si vous avez un Repeater imbriqué (ou GridView aussi, je suis sûr), vous besoin de modifier Mark Brackett's answer pour ressembler à ceci, sinon vous aurez une erreur d'exécution au sujet de ne pas être en mesure de trouver un contrôle avec le nom de rpt.

<asp:Repeater ID="rpt" runat="server"> 
<ItemTemplate> 
    <li> 
     <%# Container.DataItem %>: 
     <%# ((NameValueCollection)((Repeater)Container.Parent).DataSource)[(string)Container.DataItem] %> 
    </li>  
</ItemTemplate> 
</asp:Repeater> 
1

Je trouve préférable d'utiliser un StringDictionary pour databinding & accès à clé valeur &

Dim sDict as New StringDictionary 
sDict.Add("1","data1") 
sDict.Add("2","data2") 
sDict.Add("3","data3") 
... 

CheckBoxList1.DataSource = sDict 
CheckBoxList1.DataValueField = "key" 
CheckBoxList1.DataTextField = "value" 
CheckBoxList1.DataBind() 
0

J'ai eu un problème similaire impliquant la liaison d'un dictionnaire (SortedDictionary vraiment) à un GridView et de vouloir renommer le colonnes. Ce qui a fini par travailler pour moi est quelque chose d'un peu plus facile à lire.

<asp:GridView ID="gv" runat="server" AutoGenerateColumns="False"> 
    <Columns> 
    <asp:TemplateField HeaderText="Attribute"> 
     <ItemTemplate> 
     <%# ((KeyValuePair<string,string>)Container.DataItem).Key %> 
     </ItemTemplate> 
    </asp:TemplateField> 
    <asp:TemplateField HeaderText="Value"> 
     <ItemTemplate> 
     <%# ((KeyValuePair<string,string>)Container.DataItem).Value %> 
     </ItemTemplate> 
    </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

Cela fonctionne en prenant le Container.DataItem, l'élément en cours GridView tente d'afficher, dans ce contraindre son type de données réelles (KeyValuePair), puis afficher la propriété désirée de cet article.

Questions connexes