Вложенный словарь для вложенного повторителя asp.net c # - PullRequest
7 голосов
/ 30 мая 2009

Я создаю 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()));

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

Спасибо

Marco

Ответы [ 3 ]

15 голосов
/ 30 мая 2009

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

<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
}
9 голосов
/ 24 июля 2009

Есть лучший способ сделать это без каких-либо событий 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:)

1 голос
/ 30 мая 2009

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

...