2015-06-18 1 views
0

У меня есть вложенный ретранслятор, и каждый раз, когда я компилирую проект, VS автоматически удаляет декларацию внутреннего репитера от дизайнера, и мне нужно вручную добавить его снова.Определение ретранслятора будет удалено из конструктора во вложенном ретрансляторе

protected global::System.Web.UI.WebControls.Repeater rptrSubscriptions; 

Я удалил VS temp файлы и после прочтения других вопросов, таких как мои, я также преобразовал страницу в веб-форму. Наконец, я изменил внутренний ретранслятор на 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> 

ответ

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(); 
    } 
} 
+0

Спасибо, Декер, это была отличная помощь и мудрый ответ :) Я очень ценю это. –

+1

Замечательно, что это помогло! По крайней мере, вы используете ретрансляторы. Изучите эти способы, и вы найдете ретрансляторы очень полезными и простыми в использовании. Могу ли я также предложить вам использовать серверную таблицу и TableCell не добавляет ничего, поскольку вам не нужно будет обращаться к серверу. Используйте таблицу html и потеряйте накладные расходы. – Dacker

Смежные вопросы