2014-10-13 1 views
0

У меня есть вложенный ретранслятор, содержащий элемент управления CheckBox.ASP.NET CheckBox Control, показывающий как литерал

<asp:Repeater runat="server" ID="optionalRepeater" OnItemDataBound="CheckCompCondiments"> 
    <HeaderTemplate> 
     <div class="sectionHeader" style="font-weight: bold; font-size: 13pt; text-decoration: underline; margin: 20px 0px 15px 0px;"> 
      Product Extras 
     </div> 
    </HeaderTemplate> 
    <ItemTemplate> 

     <div class="col-md-4" style="border: 1px solid #ccc; margin: 5px;"> 

      <asp:HiddenField runat="server" ID="salesMenuID" Value='<%#Eval("sales_menu_id") %>' /> 
      <asp:HiddenField runat="server" ID="minVal" Value='<%#Eval("minVal") %>' /> 
      <asp:HiddenField runat="server" ID="maxVal" Value='<%#Eval("maxVal") %>' /> 
      <p> 
       <asp:Label runat="server" ID="condHdr" style="text-decoration: underline;" Text='<%#Eval("sales_menu_desc") %>'></asp:Label> 
      </p> 

      <asp:Repeater runat="server" ID="compMenuRadio"> 
       <HeaderTemplate> 

       </HeaderTemplate> 

       <ItemTemplate> 
        <asp:HiddenField runat="server" ID="hdPriLvl"/> 
        <input type="radio" name="compSelect" runat="server"/> 
       </ItemTemplate> 
       <FooterTemplate> 
        <hr/> 
       </FooterTemplate> 
      </asp:Repeater> 

      <asp:Repeater runat="server" ID="compMenuCheck"> 
       <HeaderTemplate></HeaderTemplate> 
       <ItemTemplate> 

        <asp:HiddenField runat="server" ID="hdPriLvl" Value='<%#Eval("pPriceLvl") %>' /> 
        <asp:CheckBox runat="server" ID='compSelected' CssClass='<%# Eval("pcode") %>' Text='<%# Eval("pdesc") %> '/> 
        <%--<input type="checkbox" id="compSelect" runat="server" value='<%#Eval("pCode") %>'/>--%> 
        <%-- <%#Eval("pDesc") %>--%> 

       </ItemTemplate> 
       <FooterTemplate> 

       </FooterTemplate> 
      </asp:Repeater> 

      <asp:DropDownList runat="server" ID="compSelect" Visible="False" style="width: 98%; margin: 5px 0px 5px 0px;"/> 
     </div> 

    </ItemTemplate> 
</asp:Repeater> 

На моей стороне сервера У меня есть следующий код:

if (optionalRepeater.Items.Count > 0) 
{ 
    foreach (RepeaterItem compItem in optionalRepeater.Items) 
    { 
     HtmlInputHidden priLvlVal = (HtmlInputHidden)compItem.FindControl("hdPriLvl"); 

     foreach (Control compCtrl in compItem.Controls) 
     { 
      if (compCtrl.GetType() == typeof(CheckBox)) 
      { 
       CheckBox checkBox = (CheckBox)compCtrl; 
       CheckBox chk = (CheckBox) checkBox; 


       if (checkBox.Checked) 
       { 
        string prod = checkBox.CssClass; 
        string childGuiud = Guid.NewGuid().ToString("N").ToUpper(); 
        hasCondiment = true; 
        ShoppingCart.Instance.AddItem(prod, childGuiud, mainGuid, Session["transactionGuid"].ToString(), priLvlVal.Value, hasCondiment, 1, null); 
        checkBox.Checked = false; 
       } 
      } 


     } 
    } 
} 

Мой код получить как эту линию

if (compCtrl.GetType() == typeof(CheckBox)) 

Но никогда не делает его внутри, если заявление. Когда я ожидаю, что тип будет CheckBox, он произнесет буквальный элемент управления.

Может ли кто-нибудь увидеть что-нибудь, что я мог бы сделать неправильно, я смотрел на это какое-то время, и я не могу больше смотреть дальше.

Thanks, Somango!

ответ

0

Если вы используете ItemTemplate вы должны использовать FindControl, чтобы получить ссылку на элементы управления внутри:

foreach (RepeaterItem compItem in optionalRepeater.Items) 
{ 
    HtmlInputHidden priLvlVal = (HtmlInputHidden)compItem.FindControl("hdPriLvl"); 
    CheckBox compSelect = (CheckBox)compItem.FindControl("compSelect"); 
    if (checkBox.Checked) 
    { 
     // ... 
    } 
} 

обернув в RepeaterItem.Controls собственности вы просто найти один Literal контроль, который является контейнером для каждого элемента управления в ItemTemplate. Таким образом, вы можете установить compItem.Controls[0].Controls, чтобы найти CheckBox. Но, по-моему, использование compItem.FindControl гораздо читаемо.

+0

Спасибо за ваш ответ Время. Я пробовал ваше решение, но оно выдавало ошибку из-за моего окна DropDown с тем же идентификатором. Я обновил вопрос, включив в него родительский ретранслятор. Я должен был это сделать в первую очередь. – somango

+0

@somango: затем сначала найдите свой внутренний повторитель через 'FindControl', а затем зациклируйте эти элементы и получите' CheckBox' через 'innerItem.FindControl (« compSelect »)'. В стороне, почему бы вам не использовать 'CheckBox' вместо' input type = "radio" ', если вам нужно получить доступ к нему на сервере? –

+0

Я отмечаю это как правильный ответ. Хотя на самом деле это было не то, что я использовал, это поставило меня на правильный путь, теперь у меня есть приложение, работающее так, как ожидалось, поэтому мистер Тим Шмельтер, я говорю, что Vielen Dank !! – somango

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