多DataTable合并为一个DataTable

描述

        3个DataTable,分别为A,B,C,将A、B和C合成一个新的DataTable(D),存在A表中的内容(数据)作为D表的表头,B和C中有的需要将表头合到D中,有的需要将内容和到D中。

解决步骤

        1、先获得3个表;2、获得新表的表头;3、将A、B或C中存在唯一共同id的记录插入到D表;4、根据新表内容的ID和A、B或C表中的ID进行配对,配对上就进行更新。

       注意:A、B和C需存在一个共同的字段

核心代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using EvaluationSystem.DAL;
using System.Data;

namespace EvaluationSystem.BLL
{
    public class TownResultsTotalBLL
    {
        //定义D层变量
        private TownResultsTotalDAL townResultsTotalDAL = new TownResultsTotalDAL();
        //定义返回表
        public DataTable dtN = new DataTable();
        //获得定量等
        public DataTable dtQ = new DataTable();
        //获得定性
        public DataTable dtS = new DataTable();
        //获得定性名称
        public DataTable dtSI = new DataTable();

        #region 获得所有的年份
        /// <summary>
        /// 返回所有的年份
        /// </summary>
        /// <returns></returns>
        public DataSet GetYears(){
            return townResultsTotalDAL.GetYears();
        }
        #endregion

        #region 获得所有的级别
        /// <summary>
        /// 获得所有的级别
        /// </summary>
        /// <returns></returns>
        public DataSet GetLevels() {
            return townResultsTotalDAL.GetLevels();
        }
        #endregion

        #region 获得整个新表
        /// <summary>
        /// 多个表合并在一起
        /// </summary>
        /// <param name="strYear"></param>
        /// <returns></returns>
        public DataSet GetNewTableAll(string strYear, string strLevel = "")
        {
            //1、新表头
            dtN = GetNewTableHead(strYear, strLevel);
            //2、添加定量(添加定量总分,附加总分,总得分和排名)
            AddQulityResult();
            //3、更新定性(将所有的定性指标总分更新)
            AddSexResult();

            DataSet ds = new DataSet();
            ds.Tables.Add(dtN);
            //返回表
            return ds;
        }
        #endregion

        #region 获得新表的表头
        /// <summary>
        /// 获得新表的表头
        /// </summary>
        /// <param name="strYear"></param>
        /// <returns></returns>
        public DataTable GetNewTableHead(string strYear, string strLevel = "")
        {
            if (string.IsNullOrEmpty(strYear))
            {
                strYear = DateTime.Today.Year.ToString();
            }
            if (string.IsNullOrEmpty(strLevel))
            {
                strLevel = "";
            }

            //1、定性分数表(每个*的每个定性成绩)
            dtS = townResultsTotalDAL.GetSexResults(strYear);
            //2、定性描述表(某年,所有定性指标)
            dtSI = townResultsTotalDAL.GetSexInfo(strYear);
            //3、定量和附加分数表(总成绩,附加总成绩,总的成绩,总排名)
            dtQ = townResultsTotalDAL.GetQulityAndAddResults(strYear, strLevel);

            //获得新表的表头
            GetHeadName();
            return dtN;
        }
        #endregion

        #region 拼接新表
        #region 私有方法:1、拼接新表头(总排名,定量权重总分,附加分,每个定性名称等)
        /// <summary>
        /// 获得新表的字段值
        /// </summary>
        public void GetHeadName()
        {//*ID,总排名,*姓名,定量总得分,奖惩总得分,总得分,年份
            //添加新表的表头
            dtN.Columns.Add(new DataColumn(dtQ.Columns[0].ColumnName.ToString(), typeof(string)));
            dtN.Columns.Add(new DataColumn(dtQ.Columns[1].ColumnName.ToString(), typeof(string)));
            dtN.Columns.Add(new DataColumn(dtQ.Columns[2].ColumnName.ToString(), typeof(string)));
            dtN.Columns.Add(new DataColumn(dtQ.Columns[3].ColumnName.ToString(), typeof(string)));
            //定性指标的名称
            for (int i = 0; i < dtSI.Rows.Count; i++)
            {
                dtN.Columns.Add(new DataColumn(dtSI.Rows[i]["定性指标名称"].ToString(), typeof(string)));
            }
            dtN.Columns.Add(new DataColumn(dtQ.Columns[4].ColumnName.ToString(), typeof(string)));
            dtN.Columns.Add(new DataColumn(dtQ.Columns[5].ColumnName.ToString(), typeof(string)));
            dtN.Columns.Add(new DataColumn(dtQ.Columns[6].ColumnName.ToString(), typeof(string)));
            dtN.Columns.Add(new DataColumn(dtQ.Columns[7].ColumnName.ToString(), typeof(string)));
        }
        #endregion

        #region 私有方法:2、添加内容(定量总分,附加总分,总得分和总排名)
        /// <summary>
        /// 向dtN中先添加定量总分,附加总分和总得分和排名
        /// </summary>
        private void AddQulityResult()
        {
            //添加定量值
            for (int i = 0; i < dtQ.Rows.Count; i++)
            {
                //创建一个row对象
                DataRow drAdd = dtN.NewRow();
                for (int j = 0; j < dtQ.Columns.Count; j++)
                {
                    drAdd[dtQ.Columns[j].ColumnName.ToString()] = dtQ.Rows[i][j].ToString();
                }
                //将一整条数据写入表中
                dtN.Rows.Add(drAdd);
            }
        }
        #endregion

        #region 私有方法:3、更新内容(将每个定性权重分数更新到新表里)
        /// <summary>
        /// 将所有的定性指标总分更新
        /// </summary>
        private void AddSexResult()
        {
            for (int i = 0; i < dtN.Rows.Count; i++)
            {//dtN中选择一条记录
                int j = 0;
                string strF = dtN.Rows[i][0].ToString();
                while (j < dtS.Rows.Count)
                {
                    string strS = dtS.Rows[j][0].ToString();
                    if (strF == strS)
                    {
                        string name = dtS.Rows[j]["指标名称"].ToString();
                        dtN.Rows[i][name] = dtS.Rows[j]["定性权重得分"];
                    }
                    j++;
                }
            }
        }
        #endregion
        #endregion
    }
}

总结

       这个是多DataTable和为一个DataTabler的核心代码,如果有兴趣的话,可以实现拼接Table,动态改变Web页面的Table显示,方法有多种,例如:可以根据ASP.net生成页面的机制实现;也可以通过客户端js实现。这里需要注意的是,如果使用的是EasyUI的Table控件的话,最好使用第一种方法(已实现),第二种方法目前本人没有实现。


多DataTable合并为一个DataTable

上一篇:学习类1


下一篇:treap模板(set,map,multiset, 可持久化treap)