将NameValueCollection绑定到GridView?

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。

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

[编辑] 实际上,您可以直接使用字典:

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

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

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

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

我不能将它更改为字典,因为它是一个扩展对象,而且我仍在使用Net 2.0。但还是谢谢...无论如何,每个意见都有帮助。 - Jaroslav Urban
请记住,NameValueCollection 可以有重复的键,而 Dictionary 则不能。因此,在转换为 Dictionary 时可能会遇到问题/丢失信息。 - magnattic

6

这有点棘手,因为枚举器仅返回键。但是,您可以使用Container.DataItem获取键值,然后查找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>

如果您使用一个嵌套的DataBound Repeater-like控件和NameValueCollection,那么请查看我的答案,以便做出必要的更改。 - Adam Nofsinger

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.

1
如果您有一个嵌套的Repeater(或GridView,我确定也是如此),您需要修改Mark Brackett的答案,使其看起来像这样,否则您将会收到一个关于无法找到名为rpt的控件的运行时错误。
<asp:Repeater ID="rpt" runat="server">
<ItemTemplate>
    <li>
        <%# Container.DataItem %>:
        <%# ((NameValueCollection)((Repeater)Container.Parent).DataSource)[(string)Container.DataItem] %>
    </li>    
</ItemTemplate>
</asp:Repeater>

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

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),然后显示该项的所需属性来实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接