2011-07-22 11 views
0

XMLファイルからプログラムでWebサイトのメニューを作成しようとしています。 メニューには、メニューバーに3つのリンクがあり、マウスオーバーイベントで展開し、 コンテンツ(リンクと画像)を表示します。 xmlファイルにはMenuItemノードがあり、 はメニューバーの3つのリンクに対応し、MenuContentノードはに対応しています。疑似コードでは、 には次のようにします:LINQ to XMLグループ化

  1. xmlファイルを読んでください。
  2. xmlファイルをMenuItemノードでグループ化します。
  3. 外部リピータにMenuItemデータを設定します。
  4. 各MenuItemノードに対して、MenuContentデータを内部リピータに取り込みます。

私の問題は、MenuItemノードを適切にグループ化する方法がわからず、 が内部リピータに移入することです。グループ化のC#コードは、 が古いプロジェクトでは動作していましたが、この場合は機能しません。私はちょうどそこにいくつかのコードを取得 にそれを含めた。

どのようにC#コードをMenuItem ノードでグループ化して内部リピータに取り込むことができますか?

<asp:Repeater ID="Repeater1" runat="server"> 
    <ItemTemplate> 
     <div> 
      <asp:Repeater ID="Repeater2" runat="server"> 
       <ItemTemplate> 
        <div class="menuContent"> 
         <div> 
          <div class="menuContentItem"> 
           <a href='<%# Eval("LinkUrl") %>'> 
            <table> 
             <tr> 
              <td align="center" valign="middle"> 
               <img src='<%# Eval("ImageUrl") %>' alt='<%# Eval("ImageToolTip") %>' /> 
              </td> 
              <td align="left" valign="top"> 
               <div><%# Eval("Title") %></div> 
               <div><%# Eval("Description") %></div> 
              </td> 
             </tr> 
            </table> 
           </a> 
          </div> 
         </div> 
        </div> 
       </ItemTemplate> 
      </asp:Repeater> 
     </div> 
    </ItemTemplate> 
</asp:Repeater> 


var menuPath = Server.MapPath("~/Menu.xml"); 
var xDocument = XDocument.Load(menuPath); 
var menuItems = new List<MenuItem>(); 

var groups = (from x in xDocument.XPathSelectElements("Menu") 
       group x by new 
       { 
        Description = x.Descendants("Description").FirstOrDefault().Value, 
        ImageToolTip = x.Descendants("ImageToolTip").FirstOrDefault().Value, 
        ImageUrl = x.Descendants("ImageUrl").FirstOrDefault().Value, 
        LinkUrl = x.Descendants("LinkUrl").FirstOrDefault().Value, 
        Title = x.Descendants("Title").FirstOrDefault().Value 
       } into g 
       select g).ToDictionary(g => g.Key, g => g.ToArray()); 


Repeater1.DataSource = groups; 
Repeater1.DataBind(); 



<?xml version="1.0" encoding="utf-8" ?> 

<Menu> 
    <MenuItem> 
     <MenuContent> 
      <Title>Title 1a</Title> 
      <Description>Description 1a</Description> 
      <LinkUrl>Link URL 1a</LinkUrl> 
      <ImageUrl>Image URL 1a</ImageUrl> 
      <ImageToolTip>Image ToolTip 1a</ImageToolTip> 
     </MenuContent> 
     <MenuContent> 
      <Title>Title 2a</Title> 
      <Description>Description 2a</Description> 
      <LinkUrl>Link URL 2a</LinkUrl> 
      <ImageUrl>Image URL 2a</ImageUrl> 
      <ImageToolTip>Image ToolTip 2a</ImageToolTip> 
     </MenuContent> 
     <MenuContent> 
      <Title>Title 3a</Title> 
      <Description>Description 3a</Description> 
      <LinkUrl>Link URL 3a</LinkUrl> 
      <ImageUrl>Image URL 3a</ImageUrl> 
      <ImageToolTip>Image ToolTip 3a</ImageToolTip> 
     </MenuContent> 
    </MenuItem> 
    <MenuItem> 
     <MenuContent> 
      <Title>Title 1b</Title> 
      <Description>Description 1b</Description> 
      <LinkUrl>Link URL 1b</LinkUrl> 
      <ImageUrl>Image URL 1b</ImageUrl> 
      <ImageToolTip>Image ToolTip 1b</ImageToolTip> 
     </MenuContent> 
     <MenuContent> 
      <Title>Title 2b</Title> 
      <Description>Description 2b</Description> 
      <LinkUrl>Link URL 2b</LinkUrl> 
      <ImageUrl>Image URL 2b</ImageUrl> 
      <ImageToolTip>Image ToolTip 2b</ImageToolTip> 
     </MenuContent> 
     <MenuContent> 
      <Title>Title 3b</Title> 
      <Description>Description 3b</Description> 
      <LinkUrl>Link URL 3b</LinkUrl> 
      <ImageUrl>Image URL 3b</ImageUrl> 
      <ImageToolTip>Image ToolTip 3b</ImageToolTip> 
     </MenuContent> 
    </MenuItem> 
</Menu> 

答えて

4

代わりの凝集を使用して次のことを試みることができる。そして、

var groups = from x in xd.Element("Menu").Elements("MenuItem") 
      select new 
      { 
       Items = (from c in x.Elements("MenuContent") 
          select new 
          { 
           Description = c.Element("Description").Value, 
           ImageToolTip = c.Element("ImageToolTip").Value, 
           ImageUrl = c.Element("ImageUrl").Value, 
           LinkUrl = c.Element("LinkUrl").Value, 
           Title = c.Element("Title").Value 
          }).ToList() 
      }; 

とにRepeater2タグを変更します。

<asp:Repeater ID="Repeater2" DataSource='<%# Eval("Items") %>' runat="server"> 
+0

パーフェクト!まさに私がする必要があった!どうもありがとうございます! – Halcyon