2008-10-20 16 views
9

Welche Art von Sammlung sollte ich verwenden, um die NameValue-Sammlung in GridView zu binden? Wenn es direkt funktioniert, hat es nicht funktioniert.Bind NameValueCollection an GridView?

-Code in aspx.cs

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

-Code in 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> 

Jede Spitze sehr willkommen. Vielen Dank. X.

Antwort

8

Können Sie das Wörterbuch < Zeichenfolge, Zeichenfolge > anstelle von NameValueCollection verwenden. Da Wörterbuch < T, T > IEnumerable implementiert könnten Sie LINQ wie so verwenden:

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

[EDIT] Eigentlich können Sie in der Lage sein Wörterbuch zu verwenden, um direkt als:

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

Wenn es nicht Karte gibt Schlüssel/Wert wie Sie möchten, können Sie immer zu LINQ zurückkehren. Mit LINQ können Sie die Felder auch umbenennen, wie Sie möchten.

[EDIT] Wenn Sie das Wörterbuch < T, T > nicht ändern können, erstellen Sie eine Kopie der NameValueCollection als Dictionary in der Methode und binden Sie sie an die Methode.

Wenn Sie dies viel tun, könnten Sie eine Erweiterungsmethode in ein Wörterbuch zu konvertieren, und verwenden Sie es so.

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

Ich kann es nicht zu Dictionary ändern, da es ext-Objekt ist, und ich benutze immer noch Net 2.0. Danke trotzdem. Jede Meinung hilft. –

+0

Beachten Sie jedoch, dass NameValueCollection doppelte Schlüssel haben kann, während Dictionary nicht funktioniert. So könnten Sie beim Konvertieren in ein Dictionary Probleme bekommen/Informationen verlieren. – magnattic

2

Schließlich habe ich die Lösung in Ihrer Erweiterung Implementierung, aber ohne Erweiterung selbst verwendet.

vielleicht einige Helfer Klasse, die statisch sein wird und die Übersetzung für mich an einem Ort statt vieler tun. Diese Erweiterung ist ziemlich praktisch ... :-)

Danke. X.

6

Es ist ein wenig schwierig, weil die enumerator nur die Schlüssel zurückgibt. Aber können Sie den Schlüsselwert mit Container.DataItem, und dann in die Namevaluecollection nachschlagen, um den Wert zu erhalten:

<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

Siehe meine Antwort für eine notwendige Änderung, wenn Sie ein verschachteltes DataBound Repeater-ähnliches Steuerelement mit NameValueCollection verwenden –

1

Wenn Sie ein verschachteltes Repeater (oder GridView auch, ich bin sicher), Sie Sie müssen Mark Brackett's answer ändern, um so zu sehen, sonst erhalten Sie einen Laufzeitfehler, wenn Sie kein Steuerelement mit dem Namen rpt finden können.

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

Ich finde es am besten, einen String zu verwenden, für die Datenbindung & Zugriff auf Schlüssel & Wert

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

hatte ich ein ähnliches Problem im Zusammenhang mit einem Wörterbuch (SortedDictionary wirklich) zu einem Gridview-Bindung und will die umbenennen Säulen. Was am Ende für mich funktionierte, ist etwas leichter zu lesen.

<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> 

Dies funktioniert durch die Container.DataItem nehmen, das aktuelle Element des Gridview anzuzeigen versucht, es in sich Nötigung tatsächlicher Datentyp (KeyValuePair) und dann die gewünschte Eigenschaft dieses Elements angezeigt wird.

Verwandte Themen