Связать NameValueCollection с GridView?

В v4 вам нужно picklist_option

https:// .../?fields=custom_field_values{field_name,value,picklist_option}

Насколько я могу судить, это нигде не задокументировано. Я должен был написать в службу поддержки, чтобы получить это.

Это вернет объект, который выглядит следующим образом:

{
  "field_name": "Your Field Name", 
  "value": 1006006, 
  "picklist_option": {
    "id": 1006006, 
    "option"=>"No"
  }
}

Работает как для списков выбора, так и для списков не-выбора (те, которые не просто пропускают клавишу picklist_option).

9
задан tvanfosson 20 October 2008 в 11:23
поделиться

4 ответа

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

[РЕДАКТИРОВАНИЕ], Если Вы не можете измениться на Словарь использования <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();
}
8
ответ дан 4 December 2019 в 11:45
поделиться

Это немного хитро, потому что перечислитель возвращает только Ключи. Но, можно получить Значение ключа с Контейнером. 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>
6
ответ дан 4 December 2019 в 11:45
поделиться

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

  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.

2
ответ дан 4 December 2019 в 11:45
поделиться

Если у вас есть вложенный Repeater (или GridView тоже, я уверен), вам нужно изменить Mark Brackett's answer, чтобы он выглядел так, иначе вы получите ошибку времени выполнения о невозможности найти элемент управления с именем rpt.

<asp:Repeater ID="rpt" runat="server">
<ItemTemplate>
    <li>
        <%# Container.DataItem %>:
        <%# ((NameValueCollection)((Repeater)Container.Parent).DataSource)[(string)Container.DataItem] %>
    </li>    
</ItemTemplate>
</asp:Repeater>
1
ответ дан 4 December 2019 в 11:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: