Привязать NameValueCollection к GridView? - PullRequest
9 голосов
/ 20 октября 2008

Какой тип коллекции я должен использовать, чтобы преобразовать коллекцию 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 голосов
/ 20 октября 2008

Можете ли вы использовать словарь <строка, строка> вместо NameValueCollection. Поскольку Dictionary реализует 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 также позволит вам переименовать поля в любое, что вы хотите.

[РЕДАКТИРОВАТЬ] Если вы не можете перейти на использование словаря , сделайте копию 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();
}
6 голосов
/ 21 октября 2008

Это немного сложно, потому что перечислитель возвращает только ключи. Но вы можете получить значение Key с помощью 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>
2 голосов
/ 21 октября 2008

Наконец, я использовал решение, предложенное в вашей реализации расширения, но без самого расширения.

  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 голос
/ 13 августа 2011

Я считаю, что лучше всего использовать 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()
1 голос
/ 31 марта 2010

Если у вас есть вложенное Repeater (или, я уверен, тоже GridView), вам нужно изменить Отметить ответ Марка Брэкетта, чтобы он выглядел так, иначе вы получите пробежку ошибка, связанная с невозможностью найти элемент управления с именем rpt .

<asp:Repeater ID="rpt" runat="server">
<ItemTemplate>
    <li>
        <%# Container.DataItem %>:
        <%# ((NameValueCollection)((Repeater)Container.Parent).DataSource)[(string)Container.DataItem] %>
    </li>    
</ItemTemplate>
</asp:Repeater>
0 голосов
/ 29 марта 2012

У меня была похожая проблема, связанная с привязкой словаря (на самом деле 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), а затем отображая требуемое свойство этого элемента.

...