如何绑定嵌套中继器?
问题描述:
我有一个服务页面,显示服务的详细信息,并有一个子部分,如服务功能和收费。我创建了两个用于功能和收费的中继器。请参考下面的SQL表图像的详细资料:如何绑定嵌套中继器?
但我不知道如何该层级数据绑定到嵌套的中继器。这里是我的代码:
<!--Nested Repeater Section-->
<asp:Repeater ID="ServiceDetailsRepeater" runat="server"
onitemdatabound="ServiceDetailsRepeater_ItemDataBound">
<ItemTemplate>
<asp:HiddenField ID="service_id" runat="server" Value='<%#Eval("Id")%>'/>
<h3><a name='<%#Eval("Id")%>'></a><%#Eval("Service_name")%></h3>
<img src='<%# "images/"+ Eval("ImageName")%>' alt="picture" width="48" height="48" class="img" />
<p><%#Eval("Service_desc")%></p>
<div id="Div1" class="clr" runat="server"> </div>
<div id="Div2" class="box" runat="server">
<div id="Div3" class="box_t" runat="server">
<asp:Panel ID="Panel_ServiceFeature" runat="server" class="box_b">
<h2>Features</h2>
<ul style="font-family:Arial, Helvetica, sans-serif;font-size:11px;color:#5f5f5f">
<asp:Repeater ID="ServiceFeatureRepeater" runat="server">
<ItemTemplate>
<li><%#Eval("Feature_Text")%></li>
</ItemTemplate>
</asp:Repeater>
</ul>
</asp:Panel>
</div>
</div>
<div id="Div5" class="clr" runat="server"> </div>
<div id="Div6" class="box" runat="server">
<div id="Div7" class="box_t" runat="server">
<asp:Panel ID="Panel_ServiceCharge" runat="server" class="box_b">
<h2>Charges</h2>
<table style="font-family:Arial, Helvetica, sans-serif;font-size:11px;color:#5f5f5f">
<tr><td></td>
<td>Rs.</td><td> </td><td align="left">Months</td></tr>
<asp:Repeater ID="ServiceChargeRepeater" runat="server">
<ItemTemplate>
<tr>
<td><img src="images/sub_nav.gif" width="18px" height="14px" alt=""/></td>
<td>Rs. <%#String.Format("{0:#,###}", Eval("Charges_Per_Month"))%></td>
<td> </td>
<td><%#Eval("No_Of_Month")%> Months</td>
</tr>
</ItemTemplate>
</asp:Repeater>
</table>
</asp:Panel>
</div>
</div>
<div id="Div9" class="clr" runat="server"></div>
</ItemTemplate>
</asp:Repeater>
<!--End Section-->
最后,my web site page这是我生活的网站服务页面视图。此页面是静态的,但现在我想将此服务详细信息与数据库绑定。
答
一种方式做到这一点是简单地将内Repeater
的DataSource
属性绑定到一个合适的收集。例如。是这样的:
<asp:Repeater ID="ServiceDetailsRepeater" runat="server"
DataSourceID="SqlDataSource1">
<asp:Repeater ID="ServiceFeatureRepeater" runat="server"
DataSource="<%# DatabaseHelper.GetFeatures(Eval("Id")) %>">
...
</asp:Repeater>
<asp:Repeater ID="ChargesRepeater" runat="server"
DataSource="<%# DatabaseHelper.GetCharges(Eval("Id")) %>">
...
</asp:Repeater>
</asp:Repeater>
我也检查,如果没有特色或收费被发现特定的服务的话,面板必须关闭。所以我直接从代码中做背后
UPDATE
如果您更舒适的代码隐藏,继续这样做,但你也可以做到这一点声明通过数据绑定Repeater的Visible
财产,例如:
...
<asp:Repeater ID="ServiceFeatureRepeater" runat="server"
DataSource="<%# DatabaseHelper.GetFeatures(Eval("Id")) %>"
Visible="<%# DatabaseHelper.HasFeatures(Eval("Id")) %>"
>
...
</asp:Repeater>
....
答
if (!Page.IsPostBack)
{
ServiceListRepeater.DataSource = DatabaseHelper.GetSummaryOfActiveServices();
ServiceListRepeater.DataBind();
ServiceDetailsRepeater.DataSource = DatabaseHelper.GetSummaryOfActiveServices();
ServiceDetailsRepeater.DataBind();
}
protected void ServiceDetailsRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
RepeaterItem item = e.Item;
if ((item.ItemType == ListItemType.Item) ||(item.ItemType == ListItemType.AlternatingItem))
{
HiddenField service_id = (HiddenField)item.FindControl("service_id");
Repeater service_features = (Repeater)item.FindControl("ServiceFeatureRepeater");
service_features.DataSource = DatabaseHelper.GetFeatureSummary(int.Parse(service_id.Value.ToString()));
service_features.DataBind();
if (service_features.Items.Count == 0)
{
Panel Panel_ServiceFeature = (Panel)item.FindControl("Panel_ServiceFeature");
Panel_ServiceFeature.Visible = false;
}
Repeater service_charges =(Repeater)item.FindControl("ServiceChargeRepeater");
service_charges.DataSource = DatabaseHelper.GetChargeSummary(int.Parse(service_id.Value.ToString()));
service_charges.DataBind();
if (service_charges.Items.Count == 0)
{
Panel Panel_ServiceCharge = (Panel)item.FindControl("Panel_ServiceCharge");
Panel_ServiceCharge.Visible = false;
}
}
}
我也检查是否没有发现功能或收费特定的服务,然后面板不得不关闭。所以我直接从代码后面做。 – 2013-06-05 11:56:59