Можно ли использовать 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")%> с теми же результатами.
Можно ли отобразить информацию о предыдущем элементе в SeparatorTemplate? Если нет, можете ли вы предложить альтернативный способ создания этого кода?
Спасибо





Эй, я остановлюсь на способе идентифицировать последний элемент в репитере, чтобы я мог избежать создания там разделителя:
<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>
Спасибо
Попробуй это:
Добавьте частную переменную (или две) в класс вашей WebForm, которую вы можете использовать для увеличения / отслеживания информации о рейсе, пока вы выполняете привязку данных на уровне элемента.
Затем в событии 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;
}
}
}
... или что-то в этом роде.
rFlightStops может не иметь полного количества элементов, но rFlightStops.DataSource должен.
Это решение полагается на то, что rFlightStops.Items.Count имеет полное количество элементов, что в моих тестах показывает, что это не так. Он содержит количество элементов, которые были добавлены к настоящему моменту. Таким образом, он не обнаруживает последнюю строку.