2013-09-30 6 views
0

У меня есть два повторителя, 1 вложенных в другой. Внутренний ретранслятор содержит и отображает в основном сетку текстовых полей, позволяющую пользователю вводить в набор информации.условная логика в вложенном репитере

Если есть 0 предметов для вложенного ребенка, проблем нет. В противном случае всегда будет указатель с шагом в четыре пары текстовых полей. Если есть 4 пары, мы хотим отобразить все 4 пары на 1 линии, там 8 пар, нам нужен разрыв строки между первыми 4 и вторыми 4 парами и т. Д. Для 12 .....

Я пытался это с чисто CSS, исходя из размера области и размера ящиков, заставляющих ее помещать ее в новую строку, но есть ли более чистый способ сделать это с помощью ретранслятора? Я заметил, что в некоторых браузерах и ОС я сталкиваюсь с этим, неловко обертывая.

<ItemTemplate> 
<tr> 
    <td>&nbsp;</td> 
     <td> 
      <asp:Label runat="server" ID="lbDayOfWeek" Text='<%# DataBinder.Eval(Container.DataItem, "DayOfWeek") %>'/> 
     </td> 
     <td> 
      <asp:Label runat="server" ID="lbDate" Text='<%# Format(DataBinder.Eval(Container.DataItem, "DateOfDay"), "MM/dd/yyyy") %>'/> 
     </td> 
     <td class="punches"> 
     <asp:Repeater runat="server" ID="Punches" DataSource='<%# DataBinder.Eval(Container.DataItem, "PunchPairs") %>'> 
       <HeaderTemplate> 
       </HeaderTemplate> 
       <ItemTemplate> 
        <asp:TextBox runat='server' ID='Tb1' Text='<%# if(eval("InDefault")= false,DataBinder.Eval(Container.DataItem, "InTime"),"") %>' /> 
        <asp:TextBox runat='server' ID='Tb2' Text='<%# if(eval("OutDefault")= false,DataBinder.Eval(Container.DataItem, "OutTime"),"") %>' /> 
       </ItemTemplate> 
       <FooterTemplate> 
       </FooterTemplate> 
     </asp:Repeater> 
     </td> 
     <td class="Totals"> 
      <asp:TextBox ID="txtHours" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "TotalHrs") %>' ReadOnly='true'/> 
     </td> 
    <td>&nbsp;</td> 
</tr> 

+0

Я вижу только один ретранслятор. Где другой, о котором вы говорите? –

+0

@DouglasBarbin Эта разметка вложена внутри ItemTemplate родителя. –

+0

Я не думаю, что есть чистый способ сделать это без динамического создания текстовых полей в группах по четыре раза. Тогда у вас есть проблемы жизненного цикла страницы, уничтожающие их на каждом PostBack. Возможно, вам лучше разобраться с деталями в области «Подробности», где пользователь выбирает строку Repeater, затем вы заполняете (и генерируете соответствующее количество текстовых полей) детали. –

ответ

1

Да, вы можете сделать это с помощью CSS с помощью ItemDataBound случае ребенка повторителя

О ItemDataBound события

Private Sub Punches_DataBound(sender As Object, e As RepeaterItemEventArgs) Handles Punches.ItemDataBound 
    If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then 
     Dim XDiv As HtmlGenericControl = CType(e.Item.FindControl("XDiv"), HtmlGenericControl) 
     XDiv.Attributes("Class") += " Item" & (e.Item.ItemIndex Mod 4) 
    end if 
end sub 

и в шаблоне элемента пробойников

<ItemTemplate> 
    <div runat="server" id="XDiv" class="Item"> 
     <asp:TextBox runat='server' ID='Tb1' Text='<%# if(eval("InDefault")= false,DataBinder.Eval(Container.DataItem, "InTime"),"") %>' /> 
     <asp:TextBox runat='server' ID='Tb2' Text='<%# if(eval("OutDefault")= false,DataBinder.Eval(Container.DataItem, "OutTime"),"") %>' /> 
    </div> 
</ItemTemplate> 

И CSS, чтобы их плавать

+0

Майкл, я пробовал ваше предложение. Я пытаюсь настроить привязку данных. Это позволит мне привязать только к первому ретранслятору, а не к второму вложенному ретранслятору. При этом он не находит элемент управления xdiv. Он всегда ничего не возвращает. – em3ricasforsale

+1

Я отредактировал, что ваш ответ был лишь немного, чтобы отразить то, что я получил от вашего ответа. Ты помог мне на правильном пути. – em3ricasforsale

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