663 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			663 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			C#
		
	
	
	
using BLL;
 | 
						||
using System;
 | 
						||
using System.Text;
 | 
						||
using System.Collections.Generic;
 | 
						||
using System.Linq;
 | 
						||
using Newtonsoft.Json.Linq;
 | 
						||
 | 
						||
namespace FineUIPro.Web.ZHGL.CQMSData
 | 
						||
{
 | 
						||
    public partial class CQMSNoticeDetailsData : PageBase
 | 
						||
    {
 | 
						||
         //使用DateTime.Now获取当前日期,然后获取该月第一天
 | 
						||
        DateTime firstDayOfMonth = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
 | 
						||
        
 | 
						||
        public Model.SGGLDB db = Funs.DB;
 | 
						||
        
 | 
						||
        protected void Page_Load(object sender, EventArgs e)
 | 
						||
        {
 | 
						||
            if (!IsPostBack)
 | 
						||
            {
 | 
						||
                this.ddlPageSize.SelectedValue = this.Grid1.PageSize.ToString();
 | 
						||
                // 绑定表格
 | 
						||
                this.BindGrid();
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        #region 绑定数据
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 绑定数据
 | 
						||
        /// </summary>
 | 
						||
        private void BindGrid()
 | 
						||
        {
 | 
						||
            var list = BaseDataService.GetBeUnderConstruction();
 | 
						||
 | 
						||
            if (!string.IsNullOrEmpty(this.txtProjectName.Text.Trim()))
 | 
						||
            {
 | 
						||
                list = list.Where(p => p.ProjectName.Contains(this.txtProjectName.Text.Trim())).ToList();
 | 
						||
            }
 | 
						||
 | 
						||
            var result = new List<dynamic>();
 | 
						||
            foreach (var project in list)
 | 
						||
            {
 | 
						||
                int value1 = 0; 
 | 
						||
                int value2 = 0; 
 | 
						||
                int value3 = 0;
 | 
						||
                int value4 = 0;
 | 
						||
                string value5 = "0%";
 | 
						||
                string value6 = "0%";
 | 
						||
                int value7 = 0;
 | 
						||
                int value8 = 0;
 | 
						||
                int value9 = 0;
 | 
						||
                int value10 = 0;
 | 
						||
                string value11 = "0%";
 | 
						||
                string value12 = "0%";
 | 
						||
                int value13 = 0;
 | 
						||
                int value14 = 0;
 | 
						||
                int value15 = 0;
 | 
						||
                int value16 = 0;
 | 
						||
                string value17 = "0%";
 | 
						||
                string value18 = "0%";
 | 
						||
                int value19 = 0;
 | 
						||
                int value20 = 0;
 | 
						||
                int value21 = 0;
 | 
						||
                int value22 = 0;
 | 
						||
                string value23 = "0%";
 | 
						||
                string value24 = "0%";
 | 
						||
                int value25 = 0;
 | 
						||
                int value26 = 0;
 | 
						||
                int value27 = 0;
 | 
						||
                int value28 = 0;
 | 
						||
                string value29 = "0%";
 | 
						||
                string value30 = "0%";
 | 
						||
                
 | 
						||
 | 
						||
                #region 质量共检点明细
 | 
						||
                
 | 
						||
                //专业下所有集合
 | 
						||
                List<Model.View_MonthReport_InspectionManagement> totalManagementList = BLL.InspectionManagementService.getViewMonthReportInspectionManagementByCNProfessionalIdAndDate(project.ProjectId, null, Convert.ToDateTime("2015-01-01"), DateTime.Now, false);
 | 
						||
                //专业下当期集合
 | 
						||
                List<Model.View_MonthReport_InspectionManagement> managementList = BLL.InspectionManagementService.getViewMonthReportInspectionManagementByCNProfessionalIdAndDate(project.ProjectId, null, firstDayOfMonth, DateTime.Now, false);
 | 
						||
                
 | 
						||
 | 
						||
                #region 土建
 | 
						||
 | 
						||
                string cNProfessionalId1 = (from x in db.Base_CNProfessional where x.CNProfessionalCode == "CV" select x.CNProfessionalId).FirstOrDefault();
 | 
						||
                //专业下所有集合
 | 
						||
                var totalManagementList1 = totalManagementList.Where(x => x.CNProfessionalId == cNProfessionalId1);
 | 
						||
                //专业下当期集合
 | 
						||
                var managementList1 = managementList.Where(x => x.CNProfessionalId == cNProfessionalId1);
 | 
						||
 | 
						||
                value1 = managementList1.Count();
 | 
						||
                value2 = totalManagementList1.Count();
 | 
						||
                
 | 
						||
                value3 = managementList1.Count(x => x.IsOnceQualified == true);
 | 
						||
                value4 = totalManagementList1.Count(x => x.IsOnceQualified == true);
 | 
						||
                
 | 
						||
                if (value1 != 0)//被除数不能为零
 | 
						||
                {
 | 
						||
                    value5 = Math.Round((double)value3 / (double)value1 * 100, 2) + "%";//保留两位小数、后四舍五入
 | 
						||
                }
 | 
						||
                
 | 
						||
 | 
						||
                if (value2 != 0)//被除数不能为零
 | 
						||
                {
 | 
						||
                    value6 = Math.Round((double)value4 / (double)value2 * 100, 2) + "%";//保留两位小数、后四舍五入
 | 
						||
                }
 | 
						||
 | 
						||
                #endregion
 | 
						||
                
 | 
						||
                #region 设备
 | 
						||
 | 
						||
                string cNProfessionalId2 = (from x in db.Base_CNProfessional where x.CNProfessionalCode == "EQ" select x.CNProfessionalId).FirstOrDefault();
 | 
						||
                //专业下所有集合
 | 
						||
                var totalManagementList2 = totalManagementList.Where(x => x.CNProfessionalId == cNProfessionalId2);
 | 
						||
                //专业下当期集合
 | 
						||
                var managementList2 = managementList.Where(x => x.CNProfessionalId == cNProfessionalId2);
 | 
						||
                
 | 
						||
                value7 = managementList2.Count();
 | 
						||
                value8 = totalManagementList2.Count();
 | 
						||
                
 | 
						||
                value9 = managementList2.Count(x => x.IsOnceQualified == true);
 | 
						||
                value10 = totalManagementList2.Count(x => x.IsOnceQualified == true);
 | 
						||
                
 | 
						||
                if (value7 != 0)//被除数不能为零
 | 
						||
                {
 | 
						||
                    value11 = Math.Round((double)value9 / (double)value7 * 100, 2) + "%";//保留两位小数、后四舍五入
 | 
						||
                }
 | 
						||
                
 | 
						||
 | 
						||
                if (value8 != 0)//被除数不能为零
 | 
						||
                {
 | 
						||
                    value12 = Math.Round((double)value10 / (double)value8 * 100, 2) + "%";//保留两位小数、后四舍五入
 | 
						||
                }
 | 
						||
 | 
						||
                #endregion
 | 
						||
                
 | 
						||
                #region 电气
 | 
						||
 | 
						||
                string cNProfessionalId3 = (from x in db.Base_CNProfessional where x.CNProfessionalCode == "EL" select x.CNProfessionalId).FirstOrDefault();
 | 
						||
                //专业下所有集合
 | 
						||
                var totalManagementList3 = totalManagementList.Where(x => x.CNProfessionalId == cNProfessionalId3);
 | 
						||
                //专业下当期集合
 | 
						||
                var managementList3 = managementList.Where(x => x.CNProfessionalId == cNProfessionalId3);
 | 
						||
                
 | 
						||
                value13 = managementList3.Count();
 | 
						||
                value14 = totalManagementList3.Count();
 | 
						||
                
 | 
						||
                value15 = managementList3.Count(x => x.IsOnceQualified == true);
 | 
						||
                value16 = totalManagementList3.Count(x => x.IsOnceQualified == true);
 | 
						||
                
 | 
						||
                if (value13 != 0)//被除数不能为零
 | 
						||
                {
 | 
						||
                    value17 = Math.Round((double)value15 / (double)value13 * 100, 2) + "%";//保留两位小数、后四舍五入
 | 
						||
                }
 | 
						||
                
 | 
						||
 | 
						||
                if (value14 != 0)//被除数不能为零
 | 
						||
                {
 | 
						||
                    value18 = Math.Round((double)value16 / (double)value14 * 100, 2) + "%";//保留两位小数、后四舍五入
 | 
						||
                }
 | 
						||
 | 
						||
                #endregion
 | 
						||
                
 | 
						||
                #region 仪表
 | 
						||
 | 
						||
                string cNProfessionalId4 = (from x in db.Base_CNProfessional where x.CNProfessionalCode == "IN" select x.CNProfessionalId).FirstOrDefault();
 | 
						||
                //专业下所有集合
 | 
						||
                var totalManagementList4 = totalManagementList.Where(x => x.CNProfessionalId == cNProfessionalId4);
 | 
						||
                //专业下当期集合
 | 
						||
                var managementList4 = managementList.Where(x => x.CNProfessionalId == cNProfessionalId4);
 | 
						||
                
 | 
						||
                value19 = managementList4.Count();
 | 
						||
                value20 = totalManagementList4.Count();
 | 
						||
                
 | 
						||
                value21 = managementList4.Count(x => x.IsOnceQualified == true);
 | 
						||
                value22 = totalManagementList4.Count(x => x.IsOnceQualified == true);
 | 
						||
                
 | 
						||
                if (value19 != 0)//被除数不能为零
 | 
						||
                {
 | 
						||
                    value23 = Math.Round((double)value21 / (double)value19 * 100, 2) + "%";//保留两位小数、后四舍五入
 | 
						||
                }
 | 
						||
                
 | 
						||
 | 
						||
                if (value20 != 0)//被除数不能为零
 | 
						||
                {
 | 
						||
                    value24 = Math.Round((double)value22 / (double)value20 * 100, 2) + "%";//保留两位小数、后四舍五入
 | 
						||
                }
 | 
						||
 | 
						||
                #endregion
 | 
						||
                
 | 
						||
                #region 防腐
 | 
						||
 | 
						||
                string cNProfessionalId5 = (from x in db.Base_CNProfessional where x.CNProfessionalCode == "AC" select x.CNProfessionalId).FirstOrDefault();
 | 
						||
                //专业下所有集合
 | 
						||
                var totalManagementList5 = totalManagementList.Where(x => x.CNProfessionalId == cNProfessionalId5);
 | 
						||
                //专业下当期集合
 | 
						||
                var managementList5 = managementList.Where(x => x.CNProfessionalId == cNProfessionalId5);
 | 
						||
                
 | 
						||
                value25 = managementList5.Count();
 | 
						||
                value26 = totalManagementList5.Count();
 | 
						||
                
 | 
						||
                value27 = managementList5.Count(x => x.IsOnceQualified == true);
 | 
						||
                value28 = totalManagementList5.Count(x => x.IsOnceQualified == true);
 | 
						||
                
 | 
						||
                if (value25 != 0)//被除数不能为零
 | 
						||
                {
 | 
						||
                    value29 = Math.Round((double)value27 / (double)value25 * 100, 2) + "%";//保留两位小数、后四舍五入
 | 
						||
                }
 | 
						||
                
 | 
						||
 | 
						||
                if (value26 != 0)//被除数不能为零
 | 
						||
                {
 | 
						||
                    value30 = Math.Round((double)value28 / (double)value26 * 100, 2) + "%";//保留两位小数、后四舍五入
 | 
						||
                }
 | 
						||
 | 
						||
                #endregion
 | 
						||
                
 | 
						||
                
 | 
						||
                #endregion
 | 
						||
 | 
						||
                // 构造动态对象用于绑定到Grid
 | 
						||
                result.Add(new
 | 
						||
                {
 | 
						||
                    project.ProjectId,
 | 
						||
                    project.ProjectName,
 | 
						||
                    project.ShortName,
 | 
						||
                    Value1 = value1,
 | 
						||
                    Value2 = value2,
 | 
						||
                    Value3 = value3, 
 | 
						||
                    Value4 = value4, 
 | 
						||
                    Value5 = value5, 
 | 
						||
                    Value6 = value6, 
 | 
						||
                    Value7 = value7, 
 | 
						||
                    Value8 = value8, 
 | 
						||
                    Value9 = value9, 
 | 
						||
                    Value10 = value10, 
 | 
						||
                    Value11 = value11, 
 | 
						||
                    Value12 = value12,
 | 
						||
                    Value13 = value13,
 | 
						||
                    Value14 = value14,
 | 
						||
                    Value15 = value15,
 | 
						||
                    Value16 = value16,
 | 
						||
                    Value17 = value17,
 | 
						||
                    Value18 = value18,
 | 
						||
                    Value19 = value19,
 | 
						||
                    Value20 = value20,
 | 
						||
                    Value21 = value21,
 | 
						||
                    Value22 = value22,
 | 
						||
                    Value23 = value23,
 | 
						||
                    Value24 = value24,
 | 
						||
                    Value25 = value25,
 | 
						||
                    Value26 = value26,
 | 
						||
                    Value27 = value27,
 | 
						||
                    Value28 = value28,
 | 
						||
                    Value29 = value29,
 | 
						||
                    Value30 = value30
 | 
						||
                });
 | 
						||
            }
 | 
						||
 | 
						||
            var pagedResult = result.Skip(Grid1.PageIndex * Grid1.PageSize).Take(Grid1.PageSize).ToList();
 | 
						||
            Grid1.RecordCount = result.Count;
 | 
						||
            Grid1.DataSource = pagedResult;
 | 
						||
            Grid1.DataBind();
 | 
						||
 | 
						||
 | 
						||
            var Value1Sum = pagedResult.Sum(p => p.Value1);
 | 
						||
            var Value2Sum = pagedResult.Sum(p => p.Value2);
 | 
						||
            var Value3Sum = pagedResult.Sum(p => p.Value3);
 | 
						||
            var Value4Sum = pagedResult.Sum(p => p.Value4);
 | 
						||
            var Value7Sum = pagedResult.Sum(p => p.Value7);
 | 
						||
            var Value8Sum = pagedResult.Sum(p => p.Value8);
 | 
						||
            var Value9Sum = pagedResult.Sum(p => p.Value9);
 | 
						||
            var Value10Sum = pagedResult.Sum(p => p.Value10);
 | 
						||
            var Value13Sum = pagedResult.Sum(p => p.Value13);
 | 
						||
            var Value14Sum = pagedResult.Sum(p => p.Value14);
 | 
						||
            var Value15Sum = pagedResult.Sum(p => p.Value15);
 | 
						||
            var Value16Sum = pagedResult.Sum(p => p.Value16);
 | 
						||
            var Value19Sum = pagedResult.Sum(p => p.Value19);
 | 
						||
            var Value20Sum = pagedResult.Sum(p => p.Value20);
 | 
						||
            var Value21Sum = pagedResult.Sum(p => p.Value21);
 | 
						||
            var Value22Sum = pagedResult.Sum(p => p.Value22);
 | 
						||
            var Value25Sum = pagedResult.Sum(p => p.Value25);
 | 
						||
            var Value26Sum = pagedResult.Sum(p => p.Value26);
 | 
						||
            var Value27Sum = pagedResult.Sum(p => p.Value27);
 | 
						||
            var Value28Sum = pagedResult.Sum(p => p.Value28);
 | 
						||
            
 | 
						||
            
 | 
						||
            JObject summary = new JObject();
 | 
						||
            summary.Add("ProjectName", "合计");
 | 
						||
            summary.Add("Value1", Value1Sum);
 | 
						||
            summary.Add("Value2", Value2Sum);
 | 
						||
            summary.Add("Value3", Value3Sum);
 | 
						||
            summary.Add("Value4", Value4Sum);
 | 
						||
            if (Value1Sum != 0)
 | 
						||
            {
 | 
						||
                summary.Add("Value5", Math.Round((double)Value3Sum / (double)Value1Sum * 100, 2) + "%");
 | 
						||
            }
 | 
						||
            else
 | 
						||
            {
 | 
						||
                summary.Add("Value5", "0%");
 | 
						||
            }
 | 
						||
            if (Value2Sum != 0)
 | 
						||
            {
 | 
						||
                summary.Add("Value6", Math.Round((double)Value4Sum / (double)Value2Sum * 100, 2) + "%");
 | 
						||
            }
 | 
						||
            else
 | 
						||
            {
 | 
						||
                summary.Add("Value6", "0%");
 | 
						||
            }
 | 
						||
            summary.Add("Value7", Value7Sum);
 | 
						||
            summary.Add("Value8", Value8Sum);
 | 
						||
            summary.Add("Value9", Value9Sum);
 | 
						||
            summary.Add("Value10", Value10Sum);
 | 
						||
            if (Value7Sum != 0)
 | 
						||
            {
 | 
						||
                summary.Add("Value11", Math.Round((double)Value9Sum / (double)Value7Sum * 100, 2) + "%");
 | 
						||
            }
 | 
						||
            else
 | 
						||
            {
 | 
						||
                summary.Add("Value11", "0%");
 | 
						||
            }
 | 
						||
            if (Value8Sum != 0)
 | 
						||
            {
 | 
						||
                summary.Add("Value12", Math.Round((double)Value10Sum / (double)Value8Sum * 100, 2) + "%");
 | 
						||
            }
 | 
						||
            else
 | 
						||
            {
 | 
						||
                summary.Add("Value12", "0%");
 | 
						||
            }
 | 
						||
            summary.Add("Value13", Value13Sum);
 | 
						||
            summary.Add("Value14", Value14Sum);
 | 
						||
            summary.Add("Value15", Value15Sum);
 | 
						||
            summary.Add("Value16", Value16Sum);
 | 
						||
            if (Value13Sum != 0)
 | 
						||
            {
 | 
						||
                summary.Add("Value17", Math.Round((double)Value15Sum / (double)Value13Sum * 100, 2) + "%");
 | 
						||
            }
 | 
						||
            else
 | 
						||
            {
 | 
						||
                summary.Add("Value17", "0%");
 | 
						||
            }
 | 
						||
            if (Value14Sum != 0)
 | 
						||
            {
 | 
						||
                summary.Add("Value18", Math.Round((double)Value16Sum / (double)Value14Sum * 100, 2) + "%");
 | 
						||
            }
 | 
						||
            else
 | 
						||
            {
 | 
						||
                summary.Add("Value18", "0%");
 | 
						||
            }
 | 
						||
            summary.Add("Value19", Value19Sum);
 | 
						||
            summary.Add("Value20", Value20Sum);
 | 
						||
            summary.Add("Value21", Value21Sum);
 | 
						||
            summary.Add("Value22", Value22Sum);
 | 
						||
            if (Value19Sum != 0)
 | 
						||
            {
 | 
						||
                summary.Add("Value23", Math.Round((double)Value21Sum / (double)Value19Sum * 100, 2) + "%");
 | 
						||
            }
 | 
						||
            else
 | 
						||
            {
 | 
						||
                summary.Add("Value23", "0%");
 | 
						||
            }
 | 
						||
            if (Value20Sum != 0)
 | 
						||
            {
 | 
						||
                summary.Add("Value24", Math.Round((double)Value22Sum / (double)Value20Sum * 100, 2) + "%");
 | 
						||
            }
 | 
						||
            else
 | 
						||
            {
 | 
						||
                summary.Add("Value24", "0%");
 | 
						||
            }
 | 
						||
            summary.Add("Value25", Value25Sum);
 | 
						||
            summary.Add("Value26", Value26Sum);
 | 
						||
            summary.Add("Value27", Value27Sum);
 | 
						||
            summary.Add("Value28", Value28Sum);
 | 
						||
            if (Value25Sum != 0)
 | 
						||
            {
 | 
						||
                summary.Add("Value29", Math.Round((double)Value27Sum / (double)Value25Sum * 100, 2) + "%");
 | 
						||
            }
 | 
						||
            else
 | 
						||
            {
 | 
						||
                summary.Add("Value29", "0%");
 | 
						||
            }
 | 
						||
            if (Value26Sum != 0)
 | 
						||
            {
 | 
						||
                summary.Add("Value30", Math.Round((double)Value28Sum / (double)Value26Sum * 100, 2) + "%");
 | 
						||
            }
 | 
						||
            else
 | 
						||
            {
 | 
						||
                summary.Add("Value30", "0%");
 | 
						||
            }
 | 
						||
            
 | 
						||
            Grid1.SummaryData = summary;
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region GV 数据操作
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 分页
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="sender"></param>
 | 
						||
        /// <param name="e"></param>
 | 
						||
        protected void Grid1_PageIndexChange(object sender, GridPageEventArgs e)
 | 
						||
        {
 | 
						||
            this.BindGrid();
 | 
						||
        }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 排序
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="sender"></param>
 | 
						||
        /// <param name="e"></param>
 | 
						||
        protected void Grid1_Sort(object sender, GridSortEventArgs e)
 | 
						||
        {
 | 
						||
            this.BindGrid();
 | 
						||
        }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 分页显示条数下拉框
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="sender"></param>
 | 
						||
        /// <param name="e"></param>
 | 
						||
        protected void ddlPageSize_SelectedIndexChanged(object sender, EventArgs e)
 | 
						||
        {
 | 
						||
            Grid1.PageSize = Convert.ToInt32(ddlPageSize.SelectedValue);
 | 
						||
            this.BindGrid();
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
 | 
						||
        #region 关闭弹出窗
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 关闭弹出窗
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="sender"></param>
 | 
						||
        /// <param name="e"></param>
 | 
						||
        protected void Window1_Close(object sender, WindowCloseEventArgs e)
 | 
						||
        {
 | 
						||
            BindGrid();
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region 导出按钮
 | 
						||
 | 
						||
        /// 导出按钮
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="sender"></param>
 | 
						||
        /// <param name="e"></param>
 | 
						||
        protected void btnOut_Click(object sender, EventArgs e)
 | 
						||
        {
 | 
						||
            Response.ClearContent();
 | 
						||
            string filename = Funs.GetNewFileName();
 | 
						||
            Response.AddHeader("content-disposition",
 | 
						||
                "attachment; filename=" +
 | 
						||
                System.Web.HttpUtility.UrlEncode("共检点明细表" + filename, System.Text.Encoding.UTF8) + ".xls");
 | 
						||
            Response.ContentType = "application/excel";
 | 
						||
            Response.ContentEncoding = System.Text.Encoding.UTF8;
 | 
						||
            this.BindGrid();
 | 
						||
            Response.Write(GetGridTableHtml(Grid1));
 | 
						||
            Response.End();
 | 
						||
        }
 | 
						||
 | 
						||
                /// <summary>
 | 
						||
        /// 导出方法
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="grid"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        private string GetGridTableHtml(Grid grid)
 | 
						||
        {
 | 
						||
            StringBuilder sb = new StringBuilder();
 | 
						||
            sb.Append("<meta http-equiv=\"content-type\" content=\"application/excel; charset=UTF-8\"/>");
 | 
						||
            sb.Append("<table cellspacing=\"0\" rules=\"all\" border=\"1\" style=\"border-collapse:collapse;\">");
 | 
						||
 | 
						||
            // 收集所有列信息,包括嵌套的列
 | 
						||
            List<GridColumn> flattenedColumns = new List<GridColumn>();
 | 
						||
            List<int> columnLevels = new List<int>();
 | 
						||
            int maxLevel = GetFlattenedColumns(grid.Columns, flattenedColumns, columnLevels, 0);
 | 
						||
 | 
						||
            // 生成表头
 | 
						||
            for (int level = 0; level <= maxLevel; level++)
 | 
						||
            {
 | 
						||
                sb.Append("<tr>");
 | 
						||
                int i = 0;
 | 
						||
                while (i < flattenedColumns.Count)
 | 
						||
                {
 | 
						||
                    GridColumn column = flattenedColumns[i];
 | 
						||
                    int columnLevel = columnLevels[i];
 | 
						||
                    
 | 
						||
                    if (columnLevel == level)
 | 
						||
                    {
 | 
						||
                        // 计算跨行和跨列数
 | 
						||
                        int rowspan = 1;
 | 
						||
                        int colspan = 1;
 | 
						||
                        
 | 
						||
                        if (column is GroupField groupField && groupField.Columns != null && groupField.Columns.Count > 0)
 | 
						||
                        {
 | 
						||
                            // 这是一个分组列,计算它的子列数量
 | 
						||
                            colspan = CountLeafColumns(groupField);
 | 
						||
                            rowspan = 1;
 | 
						||
                        }
 | 
						||
                        else
 | 
						||
                        {
 | 
						||
                            // 这是一个叶子列,需要跨行
 | 
						||
                            rowspan = maxLevel - level + 1;
 | 
						||
                            colspan = 1;
 | 
						||
                        }
 | 
						||
                        
 | 
						||
                        string cellValue = column.HeaderText ?? "";
 | 
						||
                        if (rowspan > 1)
 | 
						||
                        {
 | 
						||
                            sb.AppendFormat("<td rowspan=\"{0}\" align=\"center\">{1}</td>", rowspan, cellValue);
 | 
						||
                        }
 | 
						||
                        else
 | 
						||
                        {
 | 
						||
                            sb.AppendFormat("<td colspan=\"{0}\" align=\"center\">{1}</td>", colspan, cellValue);
 | 
						||
                        }
 | 
						||
                        
 | 
						||
                        // 跳过已处理的子列
 | 
						||
                        if (colspan > 1)
 | 
						||
                        {
 | 
						||
                            i += colspan;
 | 
						||
                        }
 | 
						||
                        else
 | 
						||
                        {
 | 
						||
                            i++;
 | 
						||
                        }
 | 
						||
                    }
 | 
						||
                    else if (columnLevel < level && !(column is GroupField))
 | 
						||
                    {
 | 
						||
                        // 已经由rowspan处理的单元格,跳过
 | 
						||
                        i++;
 | 
						||
                    }
 | 
						||
                    else
 | 
						||
                    {
 | 
						||
                        i++;
 | 
						||
                    }
 | 
						||
                }
 | 
						||
                sb.Append("</tr>");
 | 
						||
            }
 | 
						||
 | 
						||
            // 添加数据行
 | 
						||
            foreach (GridRow row in grid.Rows)
 | 
						||
            {
 | 
						||
                sb.Append("<tr>");
 | 
						||
                List<GridColumn> leafColumns = GetLeafColumns(grid.Columns);
 | 
						||
                foreach (GridColumn column in leafColumns)
 | 
						||
                {
 | 
						||
                    string html = row.Values[column.ColumnIndex].ToString();
 | 
						||
                    if (column.ColumnID == "tfNumber")
 | 
						||
                    {
 | 
						||
                        html = (row.FindControl("lblNumber") as System.Web.UI.WebControls.Label).Text;
 | 
						||
                    }
 | 
						||
                    sb.AppendFormat("<td>{0}</td>", html);
 | 
						||
                }
 | 
						||
                sb.Append("</tr>");
 | 
						||
            }
 | 
						||
 | 
						||
            // 添加合计行
 | 
						||
            if (grid.SummaryData != null)
 | 
						||
            {
 | 
						||
                sb.Append("<tr style=\"font-weight:bold; color:red;\">");
 | 
						||
                List<GridColumn> leafColumns = GetLeafColumns(grid.Columns);
 | 
						||
                foreach (GridColumn column in leafColumns)
 | 
						||
                {
 | 
						||
                    // 使用反射获取DataField属性值,避免编译错误
 | 
						||
                    var dataFieldProperty = column.GetType().GetProperty("DataField");
 | 
						||
                    if (dataFieldProperty != null)
 | 
						||
                    {
 | 
						||
                        string dataField = dataFieldProperty.GetValue(column, null) as string;
 | 
						||
                        if (!string.IsNullOrEmpty(dataField) && grid.SummaryData.ContainsKey(dataField))
 | 
						||
                        {
 | 
						||
                            sb.AppendFormat("<td>{0}</td>", grid.SummaryData[dataField]);
 | 
						||
                        }
 | 
						||
                        else if (!string.IsNullOrEmpty(dataField) && dataField == "ProjectName")
 | 
						||
                        {
 | 
						||
                            sb.Append("<td>合计</td>");
 | 
						||
                        }
 | 
						||
                        else
 | 
						||
                        {
 | 
						||
                            sb.Append("<td></td>");
 | 
						||
                        }
 | 
						||
                    }
 | 
						||
                    else
 | 
						||
                    {
 | 
						||
                        sb.Append("<td></td>");
 | 
						||
                    }
 | 
						||
                }
 | 
						||
                sb.Append("</tr>");
 | 
						||
            }
 | 
						||
 | 
						||
            sb.Append("</table>");
 | 
						||
 | 
						||
            return sb.ToString();
 | 
						||
        }
 | 
						||
 | 
						||
        // 获取扁平化的列结构和对应的层级
 | 
						||
        private int GetFlattenedColumns(GridColumnCollection columns, List<GridColumn> flattenedColumns, List<int> columnLevels, int currentLevel)
 | 
						||
        {
 | 
						||
            int maxLevel = currentLevel;
 | 
						||
            foreach (GridColumn column in columns)
 | 
						||
            {
 | 
						||
                flattenedColumns.Add(column);
 | 
						||
                columnLevels.Add(currentLevel);
 | 
						||
                
 | 
						||
                if (column is GroupField groupField && groupField.Columns != null)
 | 
						||
                {
 | 
						||
                    int childLevel = GetFlattenedColumns(groupField.Columns, flattenedColumns, columnLevels, currentLevel + 1);
 | 
						||
                    if (childLevel > maxLevel)
 | 
						||
                        maxLevel = childLevel;
 | 
						||
                }
 | 
						||
            }
 | 
						||
            return maxLevel;
 | 
						||
        }
 | 
						||
 | 
						||
        // 计算一个分组列下的叶子节点数量
 | 
						||
        private int CountLeafColumns(GridColumn column)
 | 
						||
        {
 | 
						||
            if (column is GroupField groupField && groupField.Columns != null)
 | 
						||
            {
 | 
						||
                int count = 0;
 | 
						||
                foreach (GridColumn subColumn in groupField.Columns)
 | 
						||
                {
 | 
						||
                    count += CountLeafColumns(subColumn);
 | 
						||
                }
 | 
						||
                return count;
 | 
						||
            }
 | 
						||
            else
 | 
						||
            {
 | 
						||
                return 1;
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        // 获取所有叶子节点列
 | 
						||
        private List<GridColumn> GetLeafColumns(GridColumnCollection columns)
 | 
						||
        {
 | 
						||
            List<GridColumn> leafColumns = new List<GridColumn>();
 | 
						||
            foreach (GridColumn column in columns)
 | 
						||
            {
 | 
						||
                if (column is GroupField groupField && groupField.Columns != null)
 | 
						||
                {
 | 
						||
                    leafColumns.AddRange(GetLeafColumns(groupField.Columns));
 | 
						||
                }
 | 
						||
                else
 | 
						||
                {
 | 
						||
                    leafColumns.Add(column);
 | 
						||
                }
 | 
						||
            }
 | 
						||
            return leafColumns;
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        protected void btSearch_Click(object sender, EventArgs e)
 | 
						||
        {
 | 
						||
            BindGrid();
 | 
						||
        }
 | 
						||
    }
 | 
						||
} |