c# asp.net data-binding namevaluecollection

c# - Enlazar NameValueCollection a GridView?



asp.net data-binding (6)

¿Puedes usar Dictionary <string, string> en lugar de NameValueCollection? Como Dictionary <T, T> implementa IEnumerable, puede usar LINQ de esta forma:

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

[EDITAR] En realidad, puedes usar Dictionary directamente como:

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

Si no asigna la clave / valor de la manera que desee, siempre puede volver a LINQ. LINQ también le permite cambiar el nombre de los campos a lo que desee.

[EDITAR] Si no puede cambiar para usar Dictionary <T, T>, haga una copia de NameValueCollection como un diccionario en el método y vincule a él.

private void BindList(NameValueCollection nvpList) { Dictionary<string,string> temp = new Dictionary<string,string>(); foreach (string key in nvpList) { temp.Add(key,nvpList[key]); } resultGV.DataSource = temp; resultGV.DataBind(); }

Si haces esto mucho, podrías escribir un método de extensión para convertirlo a un diccionario y usarlo.

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(); }

¿Qué tipo de colección debería usar para convertir la colección de NameValue enlazable con GridView? Al hacerlo directamente, no funcionó.

Código en aspx.cs

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

Código en 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>

Cualquier propina bienvenida. Gracias. X.


Es un poco complicado, porque el enumerador solo devuelve las claves. Pero puede obtener el valor clave con Container.DataItem y luego buscar en NameValueCollection para obtener el valor:

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


Finalmente utilicé la solución sugerida en su implementación de extensión, pero sin la extensión en sí.

private void BindList(NvpList nvpList) { IDictionary dict = new Dictionary<string, string>(); foreach (String s in nvpList.AllKeys) dict.Add(s, nvpList[s]); resultGV.DataSource = dict; resultGV.DataBind(); }

tal vez haga alguna clase de ayuda que sea estática y haga la traducción para mí en un lugar en lugar de en muchos. Esta extensión es bastante útil ... :-)

Gracias. X.


Encuentro que es mejor usar un StringDictionary para la clave y el valor de enlace de datos y acceso

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


Tuve un problema similar con vincular un diccionario (SortedDictionary realmente) a un GridView y querer cambiar el nombre de las columnas. Lo que terminó trabajando para mí es algo un poco más fácil de leer.

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

Esto funciona tomando el Container.DataItem, el elemento actual que GridView intenta mostrar, forzándolo a su tipo de datos real (KeyValuePair) y luego mostrando la propiedad deseada de ese artículo.


Si tiene un Repeater anidado (o GridView también, estoy seguro), necesita alterar la respuesta de Mark Brackett para que se vea así, o de lo contrario obtendrá un error en tiempo de ejecución acerca de no poder encontrar un control con el nombre de rpt .

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