Привязка итогов сетки в ретрансляторе не работает
У меня есть встроенная сетка в моем репитере. На привязке элемента повторителя я связываю вид сетки и пытаюсь получить итоги, которые будут отображаться в нижних колонтитулах сетки, однако итоги не работают, что мне не хватает? Пожалуйста, кто-то может помочь Cheers
<asp:Repeater ID="rpt" runat="server" onitemdatabound="rpt_ItemDataBound" >
<HeaderTemplate>
<table>
<tr>
<td>
<asp:Label ID="lblName" runat="server" ClientIDMode="Static"></asp:Label>
</td>
<td>
<asp:Label ID="lblAddress" runat="server" ClientIDMode="Static"></asp:Label>
</td>
</tr>
</table>
</HeaderTemplate>
<ItemTemplate>
<asp:HiddenField ID="hfID" runat="server" Value='<%# DataBinder.Eval(Container, "DataItem.link_id") %>' />
<asp:GridView ID="grd" ClientIDMode="Static" runat="server"
Width="100%" DataKeyNames="ID" AutoGenerateColumns="False" GridLines="Vertical"
CellPadding="4" AllowPaging="True" AllowCustomPaging="True" PageSize="25" PagerStyle-Visible="False"
ShowFooter="true" OnRowDataBound="grd_RowDataBound">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:HiddenField ID="hfID" runat="server" ClientIDMode="Static" Value='<%# DataBinder.Eval(Container,"DataItem.id") %>' />
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField HeaderText="code" DataField="code" />
<asp:BoundField HeaderText="Description" DataField="desc" />
<asp:BoundField HeaderText="Qty" DataField="quantity" />
<asp:BoundField HeaderText="Employee Paid" DataField="e_total" />
<asp:BoundField HeaderText="Client Charged" DataField="c_total" />
</Columns>
</asp:GridView>
</ItemTemplate>
</asp:Repeater>
код позади
double dEmpTotal = 0;
double dClientTotal = 0;
protected void rpt_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
{
int ID = int.Parse(((HiddenField)e.Item.FindControl("hfID")).Value);
GridView grd = (GridView)e.Item.FindControl("grd");
DataContext dc = new DataContext(ConfigurationManager.ConnectionStrings["DB"].ConnectionString);
var qry = from p in dc.usp_list_costs(ID)
select p;
List<usp_list_costsResult> lstCosts = new List<usp_list_costsResult>();
lstCosts = qry.ToList();
double dEmpTotal = Convert.ToDouble(lstCosts.Sum(r => r.emp_total));
double dClientTotal = Convert.ToDouble(lstCosts.Sum(r => r.client_total));
grd.DataSource = lstCosts;
grd.DataBind();
}
}
protected void grd_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.Footer)
{
e.Row.Cells[4].Text = "Employee Total:" + dEmpTotal;
e.Row.Cells[5].Text = "Client Total:" + dClientTotal;
}
}
1 ответ
Я предположил, что ваши итоги всегда равны нулю, потому что вы пытаетесь получить dEmpTotal
а также dClientTotal
Значения при обработке grd_RowDataBound с типом строки - Footer, но значения были установлены в ноль в то время.
Вы должны установить общие значения при привязке данных к элементу повторителя, в rpt_ItemDataBound
вместо этого обработчик событий.
Таким образом, вам не нужно устанавливать значение строк нижнего колонтитула в grd_RowDataBound
метод вообще.
Код должен быть таким (просто добавив две последние строки в качестве примера кода)
protected void rpt_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
{
int ID = int.Parse(((HiddenField)e.Item.FindControl("hfID")).Value);
GridView grd = (GridView)e.Item.FindControl("grd");
DataContext dc = new DataContext(ConfigurationManager.ConnectionStrings["DB"].ConnectionString);
var qry = from p in dc.usp_list_costs(ID)
select p;
List<usp_list_costsResult> lstCosts = new List<usp_list_costsResult>();
lstCosts = qry.ToList();
double dEmpTotal = Convert.ToDouble(lstCosts.Sum(r => r.emp_total));
double dClientTotal = Convert.ToDouble(lstCosts.Sum(r => r.client_total));
grd.DataSource = lstCosts;
grd.DataBind();
grd.FooterRow.Cells[4].Text = "Employee Total:" + dEmpTotal;
grd.FooterRow.Cells[5].Text = "Client Total:" + dClientTotal;
}
}