2010-07-28 67 views
8

我有一个显示器需要比我用的更加动态,而且看起来无法完全找到我需要的答案。嵌套中继器

     Customer a  Customer b  Customer c (and so on) 
    savings with product a 

    savings with product b 

    (and so on) 

我知道每个字段总会有一个最小值。有人说使用嵌入式中继器或其他东西。我环顾四周,无法找到如何使用嵌套中继器。我处于截止日期之前,不能真正玩弄东西,直到找到有效的东西。

应该用什么asp控件来做到这一点?一个例子会很好,但我只需要帮助正确的方向。

我正在使用sql,但通过链接获取数据。数据以列表形式结束。

谢谢你的帮助!

+0

Waht是你从数据库中获得的数据的形状?你应该如何展示这些信息,从设计,使用div,表格的任何requiremnets? – 2010-07-28 18:44:50

回答

17

嵌套中继器很容易。只要将一个在你的ItemTemplate,并在主中继器的OnItemDataBound事件做以下

if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
{ 
    DataRowView row = (DataRowView)e.Item.DataItem; 

    Repeater nestedRepeater = e.Item.FindControl("NestedRepeater") as Repeater; 
    nestedRepeater.DataSource = getSavingsPerCustomer(row["customerID"]); 
    nestedRepeater.DataBind(); 
} 

凡外中继的模板有一个客户名称和一个中继器和内部人有不同的储蓄

可能不正确的语法,但你的想法

<asp:repeater ID="outer"> 
<HeaderTemplate> 
    <div style="float:left"> 
</HeaderTemplate> 
<ItemTemplate> 
    Customer: <%= Eval(customer)%><br/> 
    <asp:repeater ID="NestedRepeater"> 
      <ItemTemplate> 
      Saving: <%= Eval(saving)%><br/> 
      </ItemTemplate> 
    </asp:repeater> 
</ItemTemplate> 
<FooterTemplate> 
    </div> 
</FooterTemplate> 
</asp:repeater> 

Similar SO question: Repeater in Repeater

1

您可以使用带有AutoGenerateColumns =“true”的GridView。 这将根据您绑定的数据源创建您的collumns。

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="true"> 
</asp:GridView> 

考虑这个类

public class A 
{ 
    public string Field1 { get; set; } 
    public int Field2 { get; set; } 
} 

而这种代码

GridView1.DataSource = new List<A>() { 
    new A() { Field1 = "a", Field2 = 1 }, 
    new A() { Field1 = "b", Field2 = 2 }, 
    new A() { Field1 = "c", Field2 = 3 }, 
}; 
GridView1.DataBind(); 

这将生成一个HTML表以名为Field 1和Field2与相应的3排列。像这样的东西。

<table> 
    <tbody> 
     <tr> 
      <th scope=col>Field1</th> 
      <th scope=col>Field2</th> 
     </tr> 
     <tr> 
      <td>a</td> 
      <td>1</td> 
     </tr> 
     <tr> 
      <td>b</td> 
      <td>2</td> 
     </tr> 
     <tr> 
      <td>c</td> 
      <td>3</td> 
     </tr> 
    </tbody> 
</table> 

如果您将数据源更改为具有不同列的另一个源,它将自动为您生成相应的列。

3

我知道这个问题是一个数据表,但我试图用对象完成同样的任务时发现了这个问题,我没有找到答案,并认为这对其他人有用。

如果您使用的是已嵌套在其对象的对象,你这样设置

DataSource='<%# Eval("ChildDataSourceProperty") %>' 

数据源,我呼吁所有其他的答案得出这一结论似乎太复杂

这里是我的完整的中继器代码

<asp:Repeater ID="linkGroups" 
       runat="server" 
       DataSource="add your datasource"> 
    <ItemTemplate> 
     <dt><%# Eval("ParentProperty") %></dt> 
     <dd>     
      <asp:Repeater ID="links" 
          runat="server" 
          DataSource='<%# Eval("ChildDataSourceProperty") %>'> 
       <ItemTemplate> 
        <p><%# Eval("ChildObjectProperty") %></p> 
       </ItemTemplate> 
      </asp:Repeater> 
     </dd> 
    </ItemTemplate> 
</asp:Repeater>