Question

J'ai un patron en colère qui va m'attaquer si je perds un autre jour à ce sujet :-P Beaucoup de points de karma au guru ajax qui peut résoudre mon dilemme.

Mais plus en détail: je veux avoir un AccordionPane qui récupère un tas de liens à partir d'une source XML et se remplisse à partir de cette source.

Était-ce utile?

La solution

Il y a peut-être un moyen plus sexy, mais cela fonctionne. Renseignez votre source de données comme vous le souhaitez. C'était juste à des fins de démonstration. Idem pour PrettyTitle () Key est de rappeler qu’il existe deux types d’éléments dans l’accordéon.

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Accordion Binding</title>
</head>
<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="AjaxScriptManager" runat="server">
    </asp:ScriptManager>
    <div>
        <cc1:Accordion ID="AccordionControl" runat="server" 
            onitemdatabound="AccordionControl_ItemDataBound">
            <Panes></Panes>
            <HeaderTemplate>
                <asp:Label ID="HeaderLabel" runat="server" />
            </HeaderTemplate>
            <ContentTemplate>
                <asp:Literal ID="ContentLiteral" runat="server" />
                <asp:HyperLink ID="ContentLink" runat="server" />
            </ContentTemplate>
        </cc1:Accordion><asp:xmldatasource runat="server" ID="RockNUGTwitter" ></asp:xmldatasource>
    </div>
    </form>
</body>

</html>

Et codebehind est:

Using System;
using System.Web.UI.WebControls;
using System.Xml;

namespace Ajaxy
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Fill();
        }

        private void Fill()
        {

            PopulateDataSource();
            AccordionControl.DataSource = RockNUGTwitter.GetXmlDocument().SelectNodes("//item");
            AccordionControl.DataBind();

        }

        private void PopulateDataSource()
        {
            XmlDocument RockNugTwitterRSSDocument = new XmlDocument();
            RockNugTwitterRSSDocument.Load("http://twitter.com/statuses/user_timeline/15912811.rss");
            RockNUGTwitter.Data = RockNugTwitterRSSDocument.OuterXml;
        }

        protected void AccordionControl_ItemDataBound(object sender, AjaxControlToolkit.AccordionItemEventArgs e)
        {
            XmlNode ItemNode = (XmlNode)e.AccordionItem.DataItem;
            if(e.AccordionItem.ItemType == AjaxControlToolkit.AccordionItemType.Content)
            {
                HyperLink ContentLink = (HyperLink)e.AccordionItem.FindControl("ContentLink");
                ContentLink.NavigateUrl = ItemNode.SelectSingleNode("link").InnerText;
                Literal ContentLiteral = (Literal)e.AccordionItem.FindControl("ContentLiteral");
                ContentLiteral.Text = ItemNode.SelectSingleNode("title").InnerText;
                ContentLink.Text = "Link";
            }
            else if(e.AccordionItem.ItemType == AjaxControlToolkit.AccordionItemType.Header)
            {
                Label HeaderLabel = (Label) e.AccordionItem.FindControl("HeaderLabel");
                HeaderLabel.Text = PrettyTitle(ItemNode.SelectSingleNode("title").InnerText);
            }
        }

        private string PrettyTitle(string FullItem)
        {
            string PrettyString = FullItem.Replace("RockNUG: ", "");
            string[] Words = PrettyString.Split(' ');
            const int MAX_WORDS_TOSHOW = 4;
            int WordsToShow = MAX_WORDS_TOSHOW;
            if(Words.Length < MAX_WORDS_TOSHOW)
            {
                WordsToShow = Words.Length;
            }
            PrettyString = String.Join(" ", Words, 0, WordsToShow);
            if (Words.Length > WordsToShow)
            {
                PrettyString += "...";
            }
            return PrettyString;
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top