Форматирование вывода определенных элементов, связанных с Repeater - PullRequest
3 голосов
/ 03 ноября 2011

Например, в бэкэнде я привязываю таблицу данных к повторителю, а во внешнем интерфейсе я настраиваю свой повторитель следующим образом:

<asp:Repeater ID="Repeater1" runat="server" onitemdatabound="Repeater1_ItemDataBound">
   <ItemTemplate>
     <div class="user">
         Name:   <%# DataBinder.Eval(Container, "DataItem.Name")%>
         Email:  <%# DataBinder.Eval(Container, "DataItem.Email")%>
         Active: <%# DataBinder.Eval(Container, "DataItem.Active")%>
         Status: <%# DataBinder.Eval(Container, "DataItem.Status")%>
     </div>
    </ItemTemplate>
</asp:Repeater>

Итак, вывод для «имени» и «электронная почта "в порядке.Однако «Active» и «Status» выводят целочисленный код, который я хотел бы изменить на более описательную строку на основе имеющейся у меня справочной таблицы.

Я предполагаю, что могу сделать это на «ItemDataBound»событие повторителя, но я застрял на том, каким должен быть мой следующий шаг, а именно проверка двух полей, которые мне нужно изменить, и их изменение.

protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        //Do modifications here
    }
}

Ответы [ 5 ]

5 голосов
/ 03 ноября 2011

Вы можете либо

  1. Обработка форматирования в событии ItemDataBound
  2. Создайте открытые методы в вашем классе Page или WebUserControl для обработки форматирования.

Использование опции 1 потребует от вас объявить элемент управления, такой как метка, для хранения значения для каждого поля следующим образом:

<asp:Repeater ID="Repeater1" runat="server" onitemdatabound="Repeater1_ItemDataBound">
   <ItemTemplate>
     <div class="user">
             <asp:Label ID="ActiveLabel" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.Name")%>'></asp:Label>
     </div>
    </ItemTemplate>
</asp:Repeater>

Затем в событии ItemDataBound вы можете найти элемент управления и установить его значение в соответствии с требованиями.

protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{

    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
            Label activeLabel = (Label)e.Item.FindControl("ActiveLabel");

            //Format label text as required
    }
}

Использование опции 2 потребует от вас создания общедоступного метода на стороне сервера, который вы можете вызвать так:

<asp:Repeater ID="Repeater1" runat="server" onitemdatabound="Repeater1_ItemDataBound">
   <ItemTemplate>
     <div class="user">
     Active: <%# FormatActive((string)DataBinder.Eval(Container, "DataItem.Active")) %>
     </div>
    </ItemTemplate>
</asp:Repeater>

Затем определите метод следующим образом:

public string FormatActive(string input)
{
     //Format as required
     //Return formatted string
}
2 голосов
/ 03 ноября 2011

Я предпочитаю создавать методы форматирования, вызываемые в разметке, а не обрабатывать ItemDataBound.

<asp:Repeater ID="Repeater1" runat="server" onitemdatabound="Repeater1_ItemDataBound">
   <ItemTemplate>
     <div class="user">
         Name:   <%# DataBinder.Eval(Container, "DataItem.Name")%>
         Email:  <%# DataBinder.Eval(Container, "DataItem.Email")%>
         Active: <%# FormatActive((int)DataBinder.Eval(Container, "DataItem.Active"))%>
         Status: <%# FormatStatus((int)DataBinder.Eval(Container, "DataItem.Status"))%>
     </div>
    </ItemTemplate>
</asp:Repeater>

Тогда в вашем коде позади:

protected static FormatActive(int active)
{
    return "Formated Active String...";
}

protected static FormatStatus(int status)
{
    return "Formated StatusString...";
}
1 голос
/ 03 ноября 2011
<asp:Repeater ID="Repeater1" runat="server" onitemdatabound="Repeater1_ItemDataBound">
   <ItemTemplate>
     <div class="user">
         Active:   <asp:label id="lblActive" Text='<%# DataBinder.Eval(Container, "DataItem.Active")%>' runat="server" />        
     </div>
    </ItemTemplate>
</asp:Repeater>


protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        //Do modifications here
        YourObjectName person = (YourObjectName)e.Item.DataItem;
        //you can now ref the object this row is bound to
        //example find a dom element
        Label lblActive= (Label)e.Item.FindControl("lblActive");

        if(person.Active == 2)
        {
            lblActive.Text = "This is great";
        }

    }
}
0 голосов
/ 03 ноября 2011

нет необходимости использовать itemdatabound. Просто добавьте метод в шаблон элемента, чтобы выполнить преобразование с параметром dataitem.active. Добавьте метку и сделайте следующее:

Text='<%# String.Format("{0}",Conversion(Eval("dataitem.active")))%>'

Преобразование - это метод, который вы оставляете в своем коде или в служебном классе, в котором выполняется преобразование.

0 голосов
/ 03 ноября 2011

Вы можете сделать что-то вроде:

<%# (int)DataBinder.Eval(Container, "DataItem.Active") == 0 ? "Active" : "Inactive" %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...