描述
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控件的话,最好使用第一种方法(已实现),第二种方法目前本人没有实现。