2011-02-18 51 views
1

我有一個手風琴控制與幾個窗格。綁定字典到手風琴窗格

在頁面加載我想設置控制窗口內的字典中的數據(每個窗格有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(); 
} 

更新:

這是我要綁定到ACCO一個dictioanry的例子rdion:

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 FOR需要的價值。

p.s.
我不認爲它metters,但如果字典綁定是一個問題,我可以綁定其他東西像xmldocument左右...

回答

0

看起來你似乎有興趣綁定到手風琴的字典值。要利用數據綁定,您應該使用控件的模板,而不是顯式定義手風琴窗格。例如:

<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> 

編碼愉快!

+0

這不是我所需要的。我想在一個窗格中有多個值。 Contentetemplate每個窗格只允許一個值。 – asker 2011-02-26 13:07:47

0

您需要嵌套數據綁定控件。

最高級別是您的手風琴 - 它被綁定到字典中。

然後,手風琴面板的內容是另一個數據綁定控件 - 不完全確定這種情況適合什麼 - 要綁定到字典值的列表。

這可能最容易使用OnDataBound事件(假設有一個)用於手風琴面板。

我現在無法提供一個有效的例子。