9

我应该使用哪种集合将 NameValue 集合转换为可绑定到 GridView?直接做的时候没用。

aspx.cs 中的代码

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

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>

任何提示都非常受欢迎。谢谢。X。

4

6 回答 6

8

您可以使用 Dictionary<string,string> 代替 NameValueCollection。由于 Dictionary<T,T> 实现了 IEnumerable,因此您可以这样使用 LINQ:

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

[编辑] 实际上你可以直接使用 Dictionary 作为:

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

如果它没有按照您想要的方式映射键/值,您可以随时返回 LINQ。LINQ 还允许您将字段重命名为您想要的任何名称。

[编辑] 如果您无法更改为使用 Dictionary<T,T>,请将 NameValueCollection 复制为方法中的 Dictionary 并绑定到它。

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

如果你经常这样做,你可以编写一个扩展方法来转换为字典,并使用它。

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();
}
于 2008-10-20T02:21:17.553 回答
6

这有点棘手,因为枚举器只返回键。但是,您可以通过 Container.DataItem 获取 Key 值,然后查找 NameValueCollection 以获取值:

<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>
于 2008-10-21T13:05:06.740 回答
2

最后,我使用了您的扩展实现中建议的解决方案,但没有扩展本身。

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

也许做一些静态的帮助类,并在一个地方而不是多个地方为我做翻译。这个扩展非常方便...... :-)

谢谢。X。

于 2008-10-21T12:41:36.600 回答
1

如果你有一个嵌套的Repeater(或者GridView我敢肯定),你需要改变Mark Brackett 的答案看起来像这样,否则你会得到一个运行时错误,关于无法找到一个名为回复_

<asp:Repeater ID="rpt" runat="server">
<ItemTemplate>
    <li>
        <%# Container.DataItem %>:
        <%# ((NameValueCollection)((Repeater)Container.Parent).DataSource)[(string)Container.DataItem] %>
    </li>    
</ItemTemplate>
</asp:Repeater>
于 2010-03-30T21:10:07.843 回答
1

我发现最好使用 StringDictionary 进行数据绑定和访问键和值

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()
于 2011-08-13T10:56:22.763 回答
0

我有一个类似的问题,涉及将字典(实际上是 SortedDictionary)绑定到 GridView 并想要重命名列。最终对我有用的是一些更容易阅读的东西。

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

这通过获取 Container.DataItem(GridView 试图显示的当前项目)将其强制转换为实际数据类型 (KeyValuePair),然后显示该项目的所需属性来工作。

于 2012-03-29T17:19:39.870 回答