我有一个嵌套的转发器,每次编译项目时,VS都会自动从设计器中删除内部转发器的声明,我必须再次手动添加它。
protected global::System.Web.UI.WebControls.Repeater rptrSubscriptions;
我删除了VS临时文件,在阅读了像我这样的其他问题之后,我还将页面转换为网页表单。 最后我将内部转发器更改为GridView,因为我认为嵌套转发器可能存在错误,但我仍然遇到同样的问题。
为了测试嵌套转发器工作正常,我添加了一个名为repeater1
的空转发器,它工作正常:它不会在编译时被删除。
任何建议将不胜感激。
<%--================================================================--%>
<asp:Repeater ID="rptrSubscriptionGroups" runat="server" OnItemDataBound="rptrSubscriptionGroups_ItemDataBound" OnItemCommand="rptrSubscriptionGroups_ItemCommand">
<ItemTemplate>
<div>
<asp:Table ID="Table1" runat="server" BorderStyle="Solid" BorderWidth="1" Width="950">
<asp:TableRow CssClass="SolidBorder">
<%--SHow Subscriptions ( Left Side )--%>
<asp:TableCell Width="550">
//some source here
</asp:TableCell>
<asp:TableCell>
<div class="">
<%--SHow Small TV+Radio Images--%>
<a href="#" style="text-decoration: none">
<asp:ImageButton ID="imgTVRadio" alt="" Style="width: 220px; height: 50px;" runat="server" OnCommand="SubscriptionGroup_Click" CommandName="SubscriptionClick" CommandArgument='<%# DataBinder.Eval(Container.DataItem,"ID")+","+DataBinder.Eval(Container.DataItem,"GroupName") %>' BorderStyle="None" />
</a>
<%-- ===========Test repeater that will not be removed from designer ====================================--%>
<asp:Repeater ID="Repeater1" runat="server"></asp:Repeater>
<%-- =========== repeater that will be removed from designer ====================================--%>
<asp:Repeater ID="rptrSubscriptions" runat="server" OnItemDataBound="rptrSubscriptions_ItemDataBound" OnItemCommand="rptrSubscriptions_ItemCommand">
<ItemTemplate>
<asp:Table ID="Table2" class="NoBorderInTable" runat="server" BorderStyle="Solid" BorderWidth="1" Width="380px">
<asp:TableRow CssClass="SolidBorder" Style="background-color: lightgray; border-color: white" Height="30px">
<%--Show Radio Buttons--%>
<asp:TableCell>
<%--<asp:RadioButton ID="RadioButton1" runat="server" />--%>
<input name="SubscriptionSelected" id="SubscriptionSelected" type="radio" value="1">
<%--Focuses on the selected radio button--%>
<script>
$('#tableSelect tr').click(function () {
$(this).find('th input:radio').prop('checked', true);
})
</script>
</asp:TableCell>
</asp:TableRow>
</asp:Table>
</ItemTemplate>
</asp:Repeater>
<%--=====================================================================================================--%>
</div>
</asp:TableCell>
</asp:TableRow>
</asp:Table>
</div>
</ItemTemplate>
</asp:Repeater>
答案 0 :(得分:1)
内置中继器或任何其他服务器控件不应该在您的设计器中。因此,如果您更改了标记中触发更新designer.cs的任何内容,它将删除所有内部服务器控件。
转发器大多数时间都会有多个项目(这就是你使用转发器的原因)。因此,如果您有10个项目绑定到您的转发器,您将无法在设计器中获得10个内部转发器。您在设计师中也不会获得1个内部中继器,因为它无法用于控制10个。
您应该在DataItemBound rptrSubscriptionGroups_ItemDataBound中访问内部转发器。我总是使用与我在标记中使用的名称相同的名称,因此它清楚你的意思:
protected void rptrSubscriptionGroups_ItemDataBound(object sender, RepeaterItemEventArgs args) {
//Get the inner repeater in the current repeater-item
Repeater rptrSubscriptions = args.Item.FindControl("rptrSubscriptions") as Repeater;
if (rptrSubscriptions != null) {
//Do what you need todo for this inner repeater
rptrSubscriptions.DataSource = someSource; //args.Item.DataItem should be the DataSource-item you bound to rptrSubscriptionGroups so use that to sort your Source for the inner repeater
rptrSubscriptions.DataBind();
}
}