Шаблон разделителя повтора с Eval - PullRequest
4 голосов
/ 21 января 2009

возможно ли использовать Eval или аналогичный синтаксис в SeparatorTemplate ретранслятора?

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

<table>
    <asp:Repeater>
        <ItemTemplate>
            <tr>
                <td><%# Eval("DepartureDateTime") %></td>
                <td><%# Eval("ArrivalDateTime") %></td>
            </tr>
        </ItemTemplate>
        <SeparatorTemplate>
            <tr>
                <td colspan="2">Change planes in <%# Eval("ArrivalAirport") %></td>
            </tr>
        </SeparatorTemplate>
    <asp:Repeater>
<table>

Прыжки, что это сгенерирует что-то вроде этого:

<table>
    <asp:Repeater>
            <tr>
                <td>2009/01/24 10:32:00</td>
                <td>2009/01/25 13:22:00</td>
            </tr>
            <tr>
                <td colspan="2">Change planes in London International Airport</td>
            </tr>
            <tr>
                <td>2009/01/25 17:10:00</td>
                <td>2009/01/25 22:42:00</td>
            </tr>
    <asp:Repeater>
<table>

Но SeparatorTemplate, похоже, игнорирует вызов Eval (). Я попытался использовать также предыдущий синтаксис, подобный этому: <% # DataBinder.Eval (Container.DataItem, "ArrivalAirport")%> с теми же результатами.

Можно ли отобразить информацию о предыдущем элементе в шаблоне Separator? Если нет, можете ли вы предложить альтернативный способ генерации этого кода?

Спасибо

Ответы [ 2 ]

2 голосов
/ 21 января 2009

Попробуйте это:

Добавьте личную переменную (или две) в класс вашей веб-формы, которую вы можете использовать для увеличения / отслеживания информации о рейсе во время выполнения привязки данных на уровне элемента.

Затем в событии ItemDatabound можно выполнить простую оценку, если привязываемый элемент данных имеет тип ListItemType.Seperator и таким образом отображать / скрывать / изменять код разделителя.

Ваша страница WebForm будет выглядеть примерно так:

public partial class ViewFlightInfo : System.Web.UI.Page
{

    private int m_FlightStops;

    protected page_load
    {

        // Etc. Etc.

    }
}

Затем, когда вы перейдете к привязке данных:

protected void rFlightStops_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    Repeater rFlightStops = (Repeater)sender;

    if (e.Item.ItemType == ListItemType.Header)
    {
        // Initialize your FlightStops in the event a new data binding occurs later. 
           m_FlightStops = 0;
    }

    if (e.Item.ItemType == ListItemType.Item
        || e.Item.ItemType == ListItemType.AlternatingItem)
    {
         // Bind your Departure and Arrival Time
         m_FlightStops++;
     }

    if (e.Item.ItemType == ListItemType.Seperator)
    {
       if (m_FlightStops == rFlightStops.Items.Count - 1)
       {
           PlaceHolder phChangePlanes = 
                    (PlaceHolder)e.Item.FindControl("phChangePlanes");
           phChangePlanes.Visible = false;
       }
    }
 }

... или что-то на этот счет.

0 голосов
/ 21 января 2009

Эй, я остановлюсь на способе идентификации последнего элемента в повторителе, чтобы я мог избежать создания там разделителя:

<table>
    <asp:Repeater>
        <ItemTemplate>
            <tr>
                <td><%# Eval("DepartureDateTime") %></td>
                <td><%# Eval("ArrivalDateTime") %></td>
            </tr>
            <% if (<<<isn't the last item>>) { %>
            <tr>
                <td colspan="2">Change planes in <%# Eval("ArrivalAirport") %></td>
            </tr>
            <% } %>
        </ItemTemplate>
    <asp:Repeater>
<table>

Спасибо

...