将字典绑定到Accordion窗格

时间:2011-02-18 07:50:27

标签: c# asp.net ajaxcontroltoolkit

我有一个带有几个窗格的Accordion控件。

在页面加载时,我想在窗格中使用来自字典的数据设置控件(每个窗格有1到10个控件)。


ASPX

<cc1:Accordion ID="Accordion1" runat="server"
               FadeTransitions="True"
               SelectedIndex="0"
               HeaderCssClass="accordionHeader"
               ContentCssClass="accordionContent"
               Width="370px">
    <Panes>
        <cc1:AccordionPane ID="AccordionPane1" runat="server">
            <Header>
                some text
            </Header>
            <Content>              
                <asp:Label ID="lblTitle" runat="server"
                           Text='<%# Eval("key1")%>'></asp:Label></li>             
            </Content>
        </cc1:AccordionPane>     
        <cc1:AccordionPane ID="AccordionPane2" runat="server">
            <Header>
                some text
            </Header>
            <Content>              
                <asp:Label ID="lblTitle" runat="server"
                           Text='<%# Eval("key2")%>'></asp:Label></li>             
            </Content>
        </cc2:AccordionPane>      
    </Panes>            
</cc1:Accordion>

C#

protected void Page_Load(object sender, EventArgs e)
{
    Dictionary<string, string> dic = new Dictionary<string, string>();
    dic.Add("key1", "XXXXXXXXXX");
    dic.Add("key2", "YYYYYYYYYY");

    Accordion1.DataSource = dic;
    Accordion1.DataBind();
} 

更新:

这是我想要与手风琴结合的一个例子:

 var dic = new Dictionary<string, IEnumerable<object>>();
        dic.Add("Item1", new List<object>() //This to Pane 1
                { 
                    new { SNumber = 12345 },
                    new { Color = "Blue" },
                    new { Size = "Large" },
                });
        dic.Add("Item2", new List<object>() //This to Pane 2
                { 
                    new { SNumber = 1235678 },
                    new { type = "OM" }
                });
        Accordion1.DataSource = dic;
        Accordion1.DataBind();
    }

在aspx上,我想为每个部分创建窗格(在本例中为2个窗格),并在每个窗格中为所需值定义Eval。

P.S。
我不认为它是metters,但如果字典绑定是一个问题,我可以绑定其他像xmldocument或其他...

2 个答案:

答案 0 :(得分:0)

您似乎有兴趣将字典值绑定到手风琴。要利用数据绑定,您应该使用控件的模板,而不是显式定义accordion窗格。例如:

<cc1:Accordion ID="Accordion1" runat="server"
               FadeTransitions="True"
               SelectedIndex="0"
               HeaderCssClass="accordionHeader"
               ContentCssClass="accordionContent"
               Width="370px">
    <HeaderTemplate>
        <h2><asp:Label runat="server" Text='<%# Eval("Key") %>' /></h2>
    </HeaderTemplate>
    <ContentTemplate>
        <div><asp:Label runat="server" Text='<%# Eval("Value") %>' /></div>
    </ContentTemplate>
</cc1:Accordion>

现在,如果你的字典值是复杂的对象,由于你描述的内容中有多个控件,这可能是真的,你仍然可以绑定到字典。考虑下面稍微涉及的字典。为简单起见,dictionar值是简单匹配的匿名类型:

protected void Page_Load(object sender, EventArgs e)
{
    Dictionary<string, object> dic = new Dictionary<string, object>();
    dic.Add("key1", new { Color = "Red", Age = 15 });
    dic.Add("key2", new { Color = "Green", Age = 25 });

    Accordion1.DataSource = dic;
    Accordion1.DataBind(); 
}

您可以使用如下配置的手风琴“追逐”数据绑定表达式中的属性:

<cc1:Accordion ID="Accordion1" runat="server"
               FadeTransitions="True"
               SelectedIndex="0"
               HeaderCssClass="accordionHeader"
               ContentCssClass="accordionContent"
               Width="370px">
    <HeaderTemplate>
        <h2><asp:Label runat="server" Text='<%# Eval("Key") %>' /></h2>
    </HeaderTemplate>
    <ContentTemplate>
        <div><asp:Label runat="server" Text='<%# Eval("Value.Color") %>' /></div>
        <div><asp:Label runat="server" Text='<%# Eval("Value.Age") %>' /></div>
    </ContentTemplate>
</cc1:Accordion>

请注意,唯一重要的区别是Eval语句中的点符号。


另一方面,如果字典值是(或包含)对象的集合,则在内容模板中嵌入更高级的ASP.NET控件是一件小事。请考虑以下字典:

var dic = new Dictionary<string, IEnumerable<object>>();
dic.Add("key1", new List<object>()
                { 
                    new { Color = "Red" },
                    new { Color = "Blue" }
                });
dic.Add("key2", new List<object>()
                { 
                    new { Color = "Yellow" },
                    new { Color = "Orange" }
                });

假设意图是在同一内容区域内呈现每种颜色。这可以通过将字典值数据绑定到转发器来实现,如下所示:

<cc1:Accordion ID="Accordion1" runat="server"
               FadeTransitions="True"
               SelectedIndex="0"
               HeaderCssClass="accordionHeader"
               ContentCssClass="accordionContent"
               Width="370px">
    <HeaderTemplate>
        <h2><asp:Label ID="Label1" runat="server" Text='<%# Eval("Key") %>' /></h2>
    </HeaderTemplate>
    <ContentTemplate>
        <asp:Repeater ID="repeater" runat="server" DataSource='<%# Eval("Value") %>'>
            <ItemTemplate>
                <div><asp:Label runat="server" Text='<%# Eval("Color") %>' /></div>
            </ItemTemplate>
        </asp:Repeater>
    </ContentTemplate>
</cc1:Accordion>

快乐的编码!

答案 1 :(得分:0)

您需要嵌套数据绑定控件。

顶级是你的手风琴 - 它被绑定到字典。

然后,手风琴小组的内容是另一个数据绑定控件 - 在这种情况下不完全确定什么是合适的 - 你想要绑定到字典值列表。

对于手风琴组,可能最容易使用OnDataBound事件(假设有一个)。

我现在无法提供一个有用的例子。