Gridview页脚行总计

时间:2013-09-24 15:39:43

标签: c# asp.net gridview

我有一个GridView,它根据用户的查询动态生成列。 这意味着有时我可以拥有1列xxx列名,或者我最多可以有4列。

所以:()表示可选

AAA | (BBB) | (CCC) | (DDD)

 1      7       45      2
 22     9       6       33
...    ...     ...     ...

我需要总结每个列的总数,而不知道在程序运行之前哪些列可用。

我正在尝试使用GridView_RowDataBound事件的e.Row.RowType == DataControlRowType.Footer部分,但我似乎无法弄清楚如何让它工作。

我通过事件的e.Row.RowType == DataControlRowType.DataRow部分保存变量中的运行总计,但我似乎无法弄清楚如何将保存的项目“注入”到页脚的基于可用列的网格。

任何人都可以给我一些帮助吗?

修改

Gridview完成基本标记,因为列是动态构建的。

<asp:GridView ID="gv" runat="server" ShowFooter="true" nRowDataBound="gv_RowDataBound">
</asp:GridView>

然后是列的代码:

private void BindGrid()
{
    DataTable dt = new DataTable();
                    var stt = from t in edcQuery.ToList()
                            where t.Technician.TeamId == 1
                            orderby t.RequestType.Name
                            select new
                            {
                                RequestType = t.RequestType.Name,
                                Tech = t.Technician.Name,
                            };
                    dt.Columns.Add("Support Ticket Type");
                    DataRow dr;
                    foreach (var col in stt.OrderBy(x => x.Tech).GroupBy(x => x.Tech))
                    {
                        dt.Columns.Add(col.Key.Substring(0, col.Key.IndexOf(' ')).Trim());
                    }
                    foreach (var type in stt.GroupBy(x => x.RequestType))
                    {
                        dr = dt.NewRow();
                        dr["Support Ticket Type"] = type.Key;
                        foreach (var tech in type.GroupBy(x => x.Tech))
                        {
                            dr[tech.Key.Substring(0, tech.Key.IndexOf(' ')).Trim()] = (object)tech.Count() == System.DBNull.Value ? 0 : tech.Count();
                        }
                        dt.Rows.Add(dr);
                    }

                    //gvEDCSupportTicketType.FooterRow.Cells[2].Text = "0";
                    gvEDCSupportTicketType.DataSource = dt;
                    gvEDCSupportTicketType.DataBind();
}

double atot = 0.0;
double btot = 0.0;
double ctot = 0.0;
double dtot = 0.0;
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
    {
        var dataRow = (DataRowView)e.Row.DataItem;

        string[] columnNames = { "AAA", "BBB", "CCC", "DDD" };

    foreach (var item in columnNames)
        {
            var checkName = dataRow.Row.Table.Columns.Cast<DataColumn>().Any(x => x.ColumnName.Equals(item, StringComparison.InvariantCultureIgnoreCase));

            if (checkName)
            {
                if (DataBinder.Eval(e.Row.DataItem, item) != DBNull.Value && Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, item)) != 0)
                {
                    switch (item)
                    {
                        case "AAA":
                            atot += Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, item));
                            break;
                        case "BBB":
                            btot += Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, item));
                            break;
                        case "CCC":
                            ctot += Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, item));
                            break;
                        case "DDD":
                            dtot += Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, item));
                            break;
                    }
                }
            }
        }
    }
    else if (e.Row.RowType == DataControlRowType.Footer)
    {
        e.Row.Cells[0].Text = "Totals:";
        e.Row.Cells[0].Attributes.Add("style", "text-align: right;");

    }
}

正如您所看到的,它从数据表构建网格,并且仅使用运行时所需的列。没有静态的FooterTemplate或任何东西。

1 个答案:

答案 0 :(得分:1)

我认为你应该使用try catch,如下所示。

      else if (e.Row.RowType == DataControlRowType.Footer)
{
    try
    {
    e.Row.Cells[0].Text = "Totals:" + atot.ToString();
    e.Row.Cells[0].Attributes.Add("style", "text-align: right;");
    }
    catch
    {
    }
    try
    {
    e.Row.Cells[1].Text = "Totals:" + btot.ToString();
    e.Row.Cells[1].Attributes.Add("style", "text-align: right;");
    }
    catch
    {
    }
    try
    {
    e.Row.Cells[2].Text = "Totals:" + ctot.ToString();
    e.Row.Cells[2].Attributes.Add("style", "text-align: right;");
    }
    catch
    {
    }
    try
    {
    e.Row.Cells[3].Text = "Totals:" + dtot.ToString();
    e.Row.Cells[3].Attributes.Add("style", "text-align: right;");
    }
    catch
    {
    }

}

        else if (e.Row.RowType == DataControlRowType.Footer)
        {
        int i = 0;
        foreach (TableCell c in e.Row.Cells)
        {
            switch (i)
            {
                case 0:
                    c.Text = "Totals:" + atot.ToString();
                    c.Attributes.Add("style", "text-align: right;");
                    break;
                case 1:
                     c.Text = "Totals:" + btot.ToString();
                    c.Attributes.Add("style", "text-align: right;");
                    break;
                case 2:
                     c.Text = "Totals:" + ctot.ToString();
                    c.Attributes.Add("style", "text-align: right;");
                    break;
                case 3:
                    c.Text = "Totals:" + dtot.ToString();
                    c.Attributes.Add("style", "text-align: right;");
                    break;
            }
            i++;
        }
        }

因此,如果有可用的页脚单元格,它将通过其他方式去捕捉部分。