Итого столбца суммы ListView и отображение в метке возвращает ноль
Я пытаюсь сложить все значения из столбца июля в метку с идентификатором июля. Вот разметка:
<asp:ListView ID="leaveListView" runat="server" ItemPlaceholderID="itemPlaceholder" OnItemDataBound="leaveListView_ItemDataBound">
<LayoutTemplate>
<table class="budgetList">
<thead>
<tr>
<td>Project Number</td>
<td>Account</td>
<td>Project Name</td>
<td>July</td>
</tr>
</thead>
<tbody>
<asp:PlaceHolder ID="itemPlaceholder" runat="server" />
</tbody>
<tfoot>
<tr class="projectRowTotal">
<td>Project Totals</td>
<td></td>
<td></td>
<td><asp:Label ID="july" runat="server" Text=""></asp:Label></td>
</tr>
</tfoot>
</table>
</LayoutTemplate>
<ItemTemplate>
<tr class="<%# Container.DataItemIndex % 2 == 0 ? "" : "even" %>">
<td><%# Eval("Project") %></td>
<td><%# Eval("Account") %></td>
<td><%# Eval("ProjectNumber") %></td>
<td><%# Eval("July") %></td>
</tr>
</ItemTemplate>
</asp:ListView>
Я использую событие ItemDataBound для суммирования, но оно возвращает ноль. Это код позади:
decimal july = 0m;
protected void leaveListView_ItemDataBound(object sender, ListViewItemEventArgs e)
{
if (e.Item.ItemType == ListViewItemType.DataItem)
{
july += Convert.ToDecimal(e.Item.FindControl("July"));
}
Label julySum = (Label)leaveListView.FindControl("july");
julySum.Text = string.Format("{0:C}", (decimal?)july);
}
Что мне нужно сделать, чтобы заставить это работать?
2 ответа
Как подсказали мои комментарии, вот решение:
<table class="budgetList">
<thead>
<tr>
<td>Project Number</td>
<td>Account</td>
<td>Project Name</td>
<td>July</td>
</tr>
</thead>
<tbody>
<asp:ListView ID="leaveListView" runat="server" ItemPlaceholderID="itemPlaceholder">
<LayoutTemplate>
<asp:PlaceHolder ID="itemPlaceholder" runat="server" />
</LayoutTemplate>
<ItemTemplate>
<tr class="<%# Container.DataItemIndex % 2 == 0 ? "" : "even" %>">
<td><%# Eval("Project") %></td>
<td><%# Eval("Account") %></td>
<td><%# Eval("ProjectNumber") %></td>
<td><%# Eval("July") %></td>
</tr>
</ItemTemplate>
</asp:ListView>
</tbody>
<tfoot>
<tr class="projectRowTotal">
<td>Project Totals</td>
<td></td>
<td></td>
<td><asp:Label ID="july" runat="server" Text=""></asp:Label></td>
</tr>
</tfoot>
</table>
на самом деле не пробовал, но должно работать нормально... + в коде, где вы связываете данные:
leaveListView.ItemsSource = <data>;
// simply place the value in label directly
july.Text = <data.sum>
теперь просто сделайте сумму в коде, и все готово, нет необходимости в событии с привязкой к элементу
e.Item.FindControl("July")
вернуть ноль, потому что нет контроля с тем, что существует в ListView
Решение
Вы хотите хранить July
значение в HiddenField (или какое-либо другое поле), чтобы вы могли получить их обратно в событии ItemDataBound.
<asp:ListView ID="leaveListView"...>
<ItemTemplate>
<tr class="<%# Container.DataItemIndex % 2 == 0 ? "" : "even" %>">
<td><%# Eval("Project") %></td>
<td><%# Eval("Account") %></td>
<td><%# Eval("ProjectNumber") %></td>
<td><%# Eval("July") %></td>
</tr>
<asp:HiddenField runat="server" ID="JulyHiddenField"
Value="<%# Eval("July") %>"/>
</ItemTemplate>
</asp:ListView>
decimal july = 0m;
protected void leaveListView_ItemDataBound(object sender,
ListViewItemEventArgs e)
{
if (e.Item.ItemType == ListViewItemType.DataItem)
{
var hiddenField = e.Item.FindControl("JulyHiddenField") as HiddenField;
july += Convert.ToDecimal(hiddenField.Value);
}
Label julySum = (Label)leaveListView.FindControl("july");
julySum.Text = string.Format("{0:C}", (decimal?)july);
}
За хорошую дизайнерскую практику
Пожалуйста, назовите свой контроль правильно. Например. <asp:Label ID="JulyLabel" runat="server" Text=""></asp:Label>
, В настоящее время у вас нет возможности узнать july
это что.