вложенный словарь во вложенный повторитель asp.net c #

Я делаю asp.page, на котором будет отображаться иерархическая информация об активах компании.

Чтобы получить данные, я использовал лямбда-выражение:

            FASAssetInfoDataContext fasInfo = new FASAssetInfoDataContext();
        var data = from g in fasInfo.Asset_Informations
                          where g.Department.Substring(0, 3) == p
                          select g;
        Dictionary<string, Dictionary<string, List<info>>> branch = data.GroupBy(e => e.Location)
            .ToDictionary(g => g.Key,
            g => g.GroupBy(gl => gl.G_L_Asset_Acct_No)
                .ToDictionary(gl => gl.Key,
                gl => gl.Select(s => new info
                {
                    acqDate = s.Acquisition_Date,
                    asstNo = s.Co_Asset_Number,
                    classInfo = s.Class,
                    description = s.Description,
                    mfgSerialNo = s.Mfg_Serial_No,
                    deprThisRun = s.Depr_This_Run__Int_,
                    AcqValue = s.Acquisition_Value__Int_,
                    currentAccDepr = s.Current_Accum_Depr__Int_,
                    estLife = s.Est_Life__YYMM___Int_,
                    inServiceDate = s.Placed_In_Service_Date__Int_,
                    netBookValue = s.Current_Net_Book_Value__Int_,
                    oldAcqValue = s.Acquisition_Value__Tax_
                }).ToList()));

Итак, у меня теперь есть вложенный набор словарей со списком информации в конце. У меня вопрос: как лучше всего отобразить эту информацию на самой странице? Я могу получить первый уровень, но изо всех сил пытаюсь заставить вложенный повторитель работать должным образом. Если есть лучший контроль, я все уши :)

Спасибо,

Марко


person Community    schedule 29.05.2009    source источник


Ответы (3)


Если вам действительно нужно использовать вложенные повторители, это возможно, но заставить его работать не особенно очевидно. Следующее будет работать (упрощено для краткости):

<asp:Repeater id="level1" OnItemDataBound="level1_ItemDataBound" ...>
  <ItemTemplate>
    <asp:Repeater id="level2" OnItemDataBound="level2_ItemDataBound" ...>
      <ItemTemplate>
        <asp:Repeater id="level3" OnItemDataBound="level3_ItemDataBound" ...>
        </asp:Repeater>
      </ItemTemplate>
    </asp:Repeater>
  </ItemTemplate>
</asp:Repeater>

Код позади:

protected void Page_Load(object sender, EventArgs e)
{
    Dictionary<string, Dictionary<string, List<info>>> branch = ...;
    level1.DataSource = branch;
    level1.DataBind();
}

protected void level1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    Dictionary<string, List<info>> data = (Dictionary<string, List<info>>)e.Item.DataItem;
    Repeater level2 = e.Item.FindControl("level2") as Repeater;
    level2.DataSource = data;
    level2.DataBind();
}

protected void level2_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    List<info> data = (List<info>)e.Item.DataItem;
    Repeater level3 = e.Item.FindControl("level3") as Repeater;
    level3.DataSource = data;
    level3.DataBind();
}

protected void level3_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
   // Bind properties from info elements in List<info> here
}
person jrista    schedule 30.05.2009
comment
Спасибо! У меня заработали вложенные репитеры. Теперь мне просто нужно их отформатировать :) - person ; 01.06.2009
comment
Хотел бы я дать больше +1, я не могу сказать, насколько это мне помогло. - person heisenberg; 05.05.2010
comment
Я тоже добавлю +1. Именно то, что я ищу. - person Brad8118; 14.03.2011

Есть более удобный способ сделать это без каких-либо событий ItemDataBound. Для простоты допустим два уровня повторителей.

<asp:Repeater id="level1" >
   <ItemTemplate>
     <asp:Repeater id="level2" 
          DataSource='<%# ((System.Collections.Generic.KeyValuePair<string,System.Collections.Generic.List<string>>)Container.DataItem).Value %>' >
      <ItemTemplate>
           <%# Container.DataItem %>
       </ItemTemplate>
      </asp:Repeater>
   </ItemTemplate>
 </asp:Repeater>

Я обычно предпочитаю этот способ, так как почему-то ненавижу события ItemDataBound :)

person HashName    schedule 23.07.2009
comment
Очень признателен HashName! Это именно то, что я искал. - person Jubal; 06.01.2011
comment
Спасибо за этот образец кода - это сработало! Я также вывожу ключ словаря во внешнем повторителе, используя code ‹h2› ‹% # ((KeyValuePair‹ string, List ‹string› ›) Container.DataItem) .Key%› ‹/h2› code - person Jonathan Williams; 21.06.2011
comment
Отлично. Для моих нужд я просто хотел перебрать дочерние объекты (каждый уровень соответствия имеет список тегов соответствия). Работает это так: ((ComplianceLevel)Container.DataItem).ComplianceTagList.OrderBy(ct => ct.Name) - person Chris; 14.08.2012

asp: TreeView? Не уверен, как он будет обрабатывать вложенный набор данных, но он предназначен для его отображения.

person n8wrl    schedule 29.05.2009
comment
Это неплохая идея. Я попробую это сделать и посмотрю, сделает ли он то, что мне нужно. Спасибо - person ; 30.05.2009