Привязка итогов сетки в ретрансляторе не работает

У меня есть встроенная сетка в моем репитере. На привязке элемента повторителя я связываю вид сетки и пытаюсь получить итоги, которые будут отображаться в нижних колонтитулах сетки, однако итоги не работают, что мне не хватает? Пожалуйста, кто-то может помочь 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;
    }
}
Другие вопросы по тегам