public partial class Organizational : BasePage { private string sql = string.Empty; private int ZuCount = 0; //组人员个数 private int BuCount = 0; //部门人员个数 DataRow[] drsOne = null; DataRow[] drsTwo = null; DataRow[] drsThree = null; DataTable dt = null; DataSet ds = null; protected override void PageLoadEvent(object sender, EventArgs e) { sql = "select depno,depnm from tb_b_DepInfo order by depno;"; //得出所有部门的编码 ds = SqlHelper.ExecuteDataset(ConnStr, CommandType.Text, sql); if (ds != null) { drsOne = ds.Tables[0].Select("depno like '%0'"); //得到一级部门编码 BindTable(drsOne); } else { AlertMessage("加载信息失败"); } } /// <summary> /// 拼写表格 /// </summary> /// <param name="dr"></param> void BindTable(DataRow[]dr) { #region 表头设置 TableRow tr; TableCell tc; tr = new TableRow(); tc = new TableCell(); tc.Text = "清流公司组织架构"; SetCss(tc); tc.CssClass = "rTd1"; tc.ColumnSpan = 3; tr.Cells.Add(tc); tlist.Rows.Add(tr); tr = new TableRow(); tc = new TableCell(); tc.Text = "部门"; SetCss(tc); tr.Cells.Add(tc); tc = new TableCell(); tc.Text = "人员"; SetCssTwo(tc); tr.Cells.Add(tc); tlist.Rows.Add(tr); #endregion if (dr.Length > 0) { for (int i = 0; i < dr.Length; i++) { //统计部门下的人员列表,包括属于部门而不属于部门分组的 sql = "select b.depno,isnull(usernm,'-----') from tb_b_UserInfo a right join tb_b_DepInfo b on a.depno=b.depno where b.depno like '" + dr[i][0].ToString().Substring(0, 1) + "%'"; dt = SqlHelper.ExecuteDataset(this.ConnStr, CommandType.Text, sql).Tables[0]; drsOne = dt.Select("depno not like '%" + dr[i][0].ToString().Substring(1, 1) + "'"); //统计部门下是否有分组,如果有分组,分组人员 if (drsOne.Length > 0 && dt.Rows.Count > 0) //第一种情况,部门下面有分组 { BuCount = dt.Rows.Count; ZuCount = drsOne.Length; drsTwo = ds.Tables[0].Select("depno like '" + dr[i][0].ToString().Substring(0, 1) + "%' and depno not like '%0'"); //统计有几个分组 drsThree = ds.Tables[0].Select("depno like '" + dr[i][0].ToString().Substring(0, 1) + "%'"); //统计有几个分组,包括部门在内 if (BuCount == ZuCount) //第一子情况,部门人数与部门分组下合计的人数相等 { FormatTableOne(drsTwo, drsOne.Length + drsTwo.Length, dr[i][0].ToString(), dr[i][1].ToString()); } else //第二子情况,部门人数与部门分组下合计的人数不相等,即存在这样的现象:部门下的人员不属于任何分组 { FormatTableOne(drsThree, drsOne.Length + drsTwo.Length + (BuCount - ZuCount), dr[i][0].ToString(), dr[i][1].ToString()); } } else //第二种情况,部门下面没有分组 { FormatTableTwo(dr[i][0].ToString(), dr[i][1].ToString(), 0); } } } } /// <summary> /// 样式设置(无单元格合并) /// </summary> /// <param name="tcc"></param> void SetCss(TableCell tcc) { tcc.HorizontalAlign = HorizontalAlign.Center; tcc.Height = 24; tcc.Width = 40; tcc.CssClass = "rTd2"; tcc.BorderWidth = 1; } /// <summary> /// 样式设置(有单元格合并) /// </summary> /// <param name="tcc"></param> void SetCssTwo(TableCell tcc) { tcc.HorizontalAlign = HorizontalAlign.Center; tcc.Height = 24; tcc.CssClass = "rTd2"; tcc.BorderWidth = 1; tcc.ColumnSpan = 2; tcc.Width = 90; } /// <summary> /// 一层合并 /// </summary> /// <param name="dt"></param> /// <param name="Counts">合并行数</param> /// <param name="depid">部门编码</param> /// <param name="depnm">合并后显示的内容</param> void FormatTableOne(DataRow[] dr,int Counts,string depid,string depnm) { TableRow tr; TableCell tc; tr = new TableRow(); tc = new TableCell(); tc.RowSpan = Counts; tc.Text = depnm; SetCss(tc); tr.Cells.Add(tc); tlist.Rows.Add(tr); for (int i = 0; i < dr.Length; i++) { if (dr[i][0].ToString().Substring(1, 1) != "0") { FormatTableTwo(dr[i][0].ToString(), dr[i][1].ToString(), 1); } else //这种适用于部门下不属于任何分组的人员 { FormatTableThree(dr[i][0].ToString()); } } } /// <summary> /// 二层合并 /// </summary> /// <param name="depid"></param> /// <param name="depnm">合并后需要显示的内容</param> /// <param name="m">1:有分组,不需要合并单元格;0:无分组,需要合并单元格</param> void FormatTableTwo(string depid, string depnm, int m) { //统计各分组或部门(无分组)下的人员列表,包括有部门无人员的情况也需要列出 DataRow[] drs = dt.Select("depno in ('" + depid + "')"); TableRow tr = new TableRow(); TableCell tc = new TableCell(); tc.Text = depnm; SetCss(tc); tr.Cells.Add(tc); if (drs.Length != 1) { tc.RowSpan = drs.Length + 1; tlist.Rows.Add(tr); } for (int i = 0; i < drs.Length; i++) { if (drs.Length != 1) { tr = new TableRow(); } tc = new TableCell(); tc.Text = drs[i][1].ToString(); if (m == 0) { SetCssTwo(tc); } else { SetCss(tc); } tr.Cells.Add(tc); tlist.Rows.Add(tr); } } /// <summary> /// 第三种情况的表格拼写:即第一种情况下的第二子情况 /// </summary> /// <param name="depid"></param> void FormatTableThree(string depid) { //统计各分组或部门(无分组)下的人员列表,包括有部门无人员的情况也需要列出 DataRow[] drs = dt.Select("depno in ('" + depid + "')"); TableRow tr; TableCell tc; for (int i = 0; i < drs.Length; i++) { tr = new TableRow(); tc = new TableCell(); tc.Text = drs[i][1].ToString(); SetCssTwo(tc); tr.Cells.Add(tc); tlist.Rows.Add(tr); } } }
这种思路大致就是:
第一步,筛选出一级部门,形成一个DataRowOne[],通过循环该DataRowOne[]去匹配所有人员,并得出属于该部门的所有记录,也就知道了一级部门(最外层)需要合并的单元行数。
第二步,通过一级部门筛选出属于该部门的所有分组。
第三步,通过部门分组编号筛选出属于该分组的所有人员,这就知道了分组需要合并的单元行数。
在编写过程中,要注意两种情况:有部门没人员,以及某人员属于某部门却不属于某部门分组,相当于部门领导。
在上面的例子中,部门编码是00,10,20,30,40,50;分组编码是21,22,23,24,25,26