我有一个带有几个窗格的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或其他...
答案 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事件(假设有一个)。
我现在无法提供一个有用的例子。