如何解决嵌套gridview中的子分组问题

时间:2009-12-17 02:42:12

标签: asp.net

绑定两个以上的网格视图时遇到网格视图问题。

我给出了目前为止所做的示例情景

我有两张桌子

第一个表:Department,包含DeptId和DeptName

10个帐户 20软件

第二张表:Emp列有EmpId,EmpName,Salary, DEPTID。

101 aaa 100 10 101 aaa 200 10 101 aaa 300 10 202 bb 101 20 202 bb 102 20 102毫升100 10 201 dd 103 20

我应该首先显示所有按其姓名命令的员工。

此外,我应该显示每个雇员工资的总和以及整个部门工资的总和

所以上面的值应该如下所示

101 aaa 100 10 101 aaa 200 10 101 aaa 300 10 emp 101的总和是600 102毫升100 10 emp 102的总和是100 部门总和10是700

202 bb 101 20 202 bb 102 20 emp 202的总和是203 201 dd 103 20 emp 202的总和是103 部门20的总和是306

我能够获得部门薪水的总和而不是员工的总和

我试过如下

我的设计页面

 <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" OnRowDataBound="GridView1_RowDataBound">
                <Columns>
                <asp:BoundField DataField="DeptID" />
                    <asp:TemplateField>
                        <ItemTemplate>

                                <asp:GridView ID="GridView2"  AutoGenerateColumns="false" runat="server">
                                    <Columns>
                                        <asp:BoundField DataField="EmpId" />
                                        <asp:BoundField DataField="EmpName" />
                                        <asp:BoundField DataField="Salary" />
                                    </Columns>
                                </asp:GridView>
                                <asp:GridView ID="GridView3"  AutoGenerateColumns="false" runat="server">
                                    <Columns>
                                        <asp:BoundField DataField="SumSalary" />
                                    </Columns>
                                </asp:GridView>

                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>

我的CodeBehind Page

public partial class _Default : System.Web.UI.Page 
{
      SqlConnection MyCon=new SqlConnection("server=ABC-415D0247602\\SQLEXPRESS; database=Employee ;integrated security=true;connection timeout=600");

    protected void Page_Load(object sender, EventArgs e)
    {
        MyCon.Open();
        SqlDataAdapter MyDa = new SqlDataAdapter("select * from department", MyCon);
        DataSet MyDs = new DataSet();
        MyDa.Fill(MyDs);
        DataTable MyDt = new DataTable();
        GridView1.DataSource = MyDs.Tables[0];
        GridView1.DataBind();


    }
    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            string j = e.Row.Cells[0].Text;

            GridView GridView2 = (GridView)e.Row.FindControl("GridView2");
            SqlDataAdapter MyDa1 = new SqlDataAdapter("select * from Emp where deptid =" +Convert.ToInt16(j), MyCon);
            DataSet MyDs1 = new DataSet();
            MyDa1.Fill(MyDs1);
            DataTable MyDt1 = new DataTable();
            GridView2.DataSource = MyDs1.Tables[0];
            GridView2.DataBind();

            GridView GridView3 = (GridView)e.Row.FindControl("GridView3");
            SqlDataAdapter MyDa2 = new SqlDataAdapter("select sum(salary) as SumSalary from Emp where deptid =" + Convert.ToInt16(j), MyCon);
            DataSet MyDs2 = new DataSet();
            MyDa2.Fill(MyDs2);
            DataTable MyDt2 = new DataTable();
            GridView3.DataSource = MyDs2.Tables[0];
            GridView3.DataBind();
        }
    }
}

我不知道在哪里放置员工薪水的总和

提前致谢 问候 cmrhema

2 个答案:

答案 0 :(得分:0)

使用转发器可以更轻松地完成:) 然而,由于挑战我做了以下事情:

 //Here lays the dragons 

小注意事项:首先你不需要通过depid订购3个gridViews,你可以使用:

 SELECT * FROM Emp  Order By depid 

这可以结合GridwView1和GridView2,并设计它,只需组合Gridview1和2中的列,如下面的解决方案中所示。

GridView1的设计

 < asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" OnRowDataBound="GridView1_RowDataBound">
            <Columns>
            <asp:BoundField DataField="DeptID" /> 
             <asp:BoundField DataField="EmpId" />
            <asp:BoundField DataField="EmpName" />
            <asp:BoundField DataField="Salary" />
            </Columns>

解决方案:

警告:此解决方案并不简单,并且绝对没有优化:)

我们的想法是在将数据绑定到GridViews之前进行操作。

解决方案如果你使用2个GridViews(就像我上面推荐的那样)
在page_load上,运行上面的SQL,并将其填入数据集(DS1),
使用DS1中填写的数据创建一个表(dt) 然后创建一个克隆DataTable(dt2)

然后通过dt1行开始循环 首先,您将EmpID记录为CurrentID
循环(dt1中的foreach行)throughRowDataBound从每行汇总工资的行,直到CurrentID!= ReadID
在数据集(DS1)中添加一行,其中“EMPID”的值为“-54321”//这将在稍后用于识别不规则行// ,和工资=总和
使sum = 0,
Make CurrentID = ReadID继续循环;

然后将DS1绑定到gridView1。

ON事件:GridView1_RowCreated

检查正在创建的行是否具有ID“-54321”(使用DataRowView),如果有,请将总和读入变量,然后清除,根据需要添加列,如下所示:

           e.Row.Cells.Clear(); 
            TableCell oCell = new TableCell(); 
            e.Row.Cells.Add(oCell); 

可以使用类似的方法为Dep工资总和添加额外的行:)

答案 1 :(得分:0)

当然,我不打算回答这个问题。 你建议使用转发器,但我去了datalist控件而不是父网格。实际上我正在寻找7个不同的表并在LINQ TO SQL中进行内连接,从而在Ilist中检索答案。 由于我无法构建所有7个表格和内容,我只提供了整个页面的小快照。

这就是我的所作所为 拿一个数据主义者的关键名称为deptid。 (第1位数据) 在datalist1的项模板中取了另一个datalist(datalist2),带有empid的关键名 删除了datalist2中的gridview,它将在gridview的模板字段中显示员工详细信息,并且有一个页脚行。

现在伪代码更接近这个

对于i = 1到datalist1 绑定datalist2 对于j = 1到datalist2 绑定gridview

在gridview的rowdatabound中 { 总结工资

if(datarow == footerrow) {    显示页脚以及总计的工资 }

由于 问候 cmrhema