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>