ASP.NET合并两个相关联的DataTable
2015-06-07 23:51
676 查看
有时候读出来他就是两个数据集,没辙,但是又要合并成一个DataTable显示出来。当然,这两个是有关联的。又如,一个DataSet中有两个相关联的DataTable,怎样把这两个表中的部分字段组合成一个DataTable或DataView。下面介绍ASP.NET代码如何实现合并两个相关联的DataTable
分为两种情况:DataTable1和DataTable2结构相同、DataTable1和DataTable2结构不同,下面分别介绍怎么进行合并。
一、DataTable1和DataTable2结构相同的情况
结构相同我们只需要把两者的数据罗列到一块就可以了
合并方法1:用Rows.Add方法
合并方法2:用DataTable.ImportRow方法
二、DataTable1和DataTable2结构不同相同的情况
我们可以先向新表中添加DataTable1的数据,然后再向每行的后面添加添加DataTable2的数据,注意两者的行数不一定相同。
方法(1)先添加第一个表,再添加第二个表
法(2)先添加行数多的表。其实我们也可以先判断哪个表的行数多,就先添加哪个表,然后再添加行少的表就可以了。
/**//// <summary>
/// 将两个列不同(结构不同)的DataTable合并成一个新的DataTable
/// </summary>
/// <param name="DataTable1">表1</param>
/// <param name="DataTable2">表2</param>
/// <param name="DTName">合并后新的表名</param>
/// <returns>合并后的新表</returns>
private DataTable UniteDataTable2(DataTable DataTable1, DataTable DataTable2, string DTName)
{
DataTable newDataTable = new DataTable();
if (DataTable1.Rows.Count > DataTable2.Rows.Count)
{
newDataTable = FillData(DataTable1, DataTable2);
}
else
{
newDataTable = FillData(DataTable2, DataTable1);
}
newDataTable.TableName = DTName; //设置DT的名字
return newDataTable;
}
private DataTable FillData(DataTable dt1, DataTable dt2)
{
//克隆DataTable1的结构
DataTable newDataTable = dt1.Clone();
for (int i = 0; i < dt2.Columns.Count; i++)
{
//再向新表中加入DataTable2的列结构
newDataTable.Columns.Add(dt2.Columns[i].ColumnName);
}
object[] obj = new object[newDataTable.Columns.Count];
//添加DataTable1的数据
for (int i = 0; i < dt1.Rows.Count; i++)
{
dt1.Rows[i].ItemArray.CopyTo(obj, 0);
newDataTable.Rows.Add(obj);
}
for (int i = 0; i < dt2.Rows.Count; i++)
{
for (int j = 0; j < dt2.Columns.Count; j++)
{
newDataTable.Rows[i][j + dt1.Columns.Count] = dt2.Rows[i][j].ToString();
}
}
return newDataTable;
}
分为两种情况:DataTable1和DataTable2结构相同、DataTable1和DataTable2结构不同,下面分别介绍怎么进行合并。
一、DataTable1和DataTable2结构相同的情况
结构相同我们只需要把两者的数据罗列到一块就可以了
合并方法1:用Rows.Add方法
DataTable newDataTable = DataTable1.Clone(); object[] obj = new object[newDataTable.Columns.Count]; //添加DataTable1的数据 for (int i = 0; i < DataTable1.Rows.Count; i++) { DataTable1.Rows[i].ItemArray.CopyTo(obj, 0); newDataTable.Rows.Add(obj); } //添加DataTable2的数据 for (int i = 0; i < DataTable2.Rows.Count; i++) { DataTable2.Rows[i].ItemArray.CopyTo(obj, 0); newDataTable.Rows.Add(obj); }
合并方法2:用DataTable.ImportRow方法
//拷贝DataTable1的结构和数据 DataTable newDataTable = DataTable1.Copy(); //添加DataTable2的数据 foreach (DataRow dr in DataTable2.Rows) { newDataTable.ImportRow(dr); }
二、DataTable1和DataTable2结构不同相同的情况
我们可以先向新表中添加DataTable1的数据,然后再向每行的后面添加添加DataTable2的数据,注意两者的行数不一定相同。
方法(1)先添加第一个表,再添加第二个表
/**/ /// <summary> /// 将两个列不同(结构不同)的DataTable合并成一个新的DataTable /// </summary> /// <param name="DataTable1">表1</param> /// <param name="DataTable2">表2</param> /// <param name="DTName">合并后新的表名</param> /// <returns>合并后的新表</returns> private DataTable UniteDataTable(DataTable DataTable1, DataTable DataTable2, string DTName) { //克隆DataTable1的结构 DataTable newDataTable = DataTable1.Clone(); for (int i = 0; i < DataTable2.Columns.Count; i++) { //再向新表中加入DataTable2的列结构 newDataTable.Columns.Add(DataTable2.Columns[i].ColumnName); } object[] obj = new object[newDataTable.Columns.Count]; //添加DataTable1的数据 for (int i = 0; i < DataTable1.Rows.Count; i++) { DataTable1.Rows[i].ItemArray.CopyTo(obj, 0); newDataTable.Rows.Add(obj); } if (DataTable1.Rows.Count >= DataTable2.Rows.Count) { for (int i = 0; i < DataTable2.Rows.Count; i++) { for (int j = 0; j < DataTable2.Columns.Count; j++) { newDataTable.Rows[i][j + DataTable1.Columns.Count] = DataTable2.Rows[i][j].ToString(); } } } else { DataRow dr3; //向新表中添加多出的几行 for (int i = 0; i < DataTable2.Rows.Count - DataTable1.Rows.Count; i++) { dr3 = newDataTable.NewRow(); newDataTable.Rows.Add(dr3); } for (int i = 0; i < DataTable2.Rows.Count; i++) { for (int j = 0; j < DataTable2.Columns.Count; j++) { newDataTable.Rows[i][j + DataTable1.Columns.Count] = DataTable2.Rows[i][j].ToString(); } } } newDataTable.TableName = DTName; //设置DT的名字 return newDataTable;
法(2)先添加行数多的表。其实我们也可以先判断哪个表的行数多,就先添加哪个表,然后再添加行少的表就可以了。
/**//// <summary>
/// 将两个列不同(结构不同)的DataTable合并成一个新的DataTable
/// </summary>
/// <param name="DataTable1">表1</param>
/// <param name="DataTable2">表2</param>
/// <param name="DTName">合并后新的表名</param>
/// <returns>合并后的新表</returns>
private DataTable UniteDataTable2(DataTable DataTable1, DataTable DataTable2, string DTName)
{
DataTable newDataTable = new DataTable();
if (DataTable1.Rows.Count > DataTable2.Rows.Count)
{
newDataTable = FillData(DataTable1, DataTable2);
}
else
{
newDataTable = FillData(DataTable2, DataTable1);
}
newDataTable.TableName = DTName; //设置DT的名字
return newDataTable;
}
private DataTable FillData(DataTable dt1, DataTable dt2)
{
//克隆DataTable1的结构
DataTable newDataTable = dt1.Clone();
for (int i = 0; i < dt2.Columns.Count; i++)
{
//再向新表中加入DataTable2的列结构
newDataTable.Columns.Add(dt2.Columns[i].ColumnName);
}
object[] obj = new object[newDataTable.Columns.Count];
//添加DataTable1的数据
for (int i = 0; i < dt1.Rows.Count; i++)
{
dt1.Rows[i].ItemArray.CopyTo(obj, 0);
newDataTable.Rows.Add(obj);
}
for (int i = 0; i < dt2.Rows.Count; i++)
{
for (int j = 0; j < dt2.Columns.Count; j++)
{
newDataTable.Rows[i][j + dt1.Columns.Count] = dt2.Rows[i][j].ToString();
}
}
return newDataTable;
}
相关文章推荐
- ASP.NET WebForm Form表单如何实现MVC那种“自动装配”效果呢?
- ASP.NET WebForm Form表单如何实现MVC那种“自动装配”效果呢?
- 如果asp.net mvc中某个action被执行了两次,请检查是不是以下的原因
- ASP.NET WebForm Form表单如何实现MVC那种“自动装配”效果呢?
- [Asp.net 5] DependencyInjection项目代码分析4-微软的实现(5)(IEnumerable<>补充)
- ASP.NET MVC3 利用滚动条加载数据
- IoC容器Autofac(4) - Autofact + Asp.net MVC + EF Code First(附源码)
- ASP.NET:在一般处理程序中通过 Session 保存验证码却无法显示图片?
- Win8操作系统下IIS如何配置asp.net的运行环境
- ASP.NET检测到不安全 Request.Form 值解决方案汇总
- ValidationSugar表单验证框架-支持ASP.NET MVC ASP.NET WebFroM
- asp.net开发微信公众平台之验证消息的真实性
- asp.net开发微信公众平台之获取用户消息并处理
- ASP.NET完整打包卸载更新攻略(By Installshield 2010)
- ASP.NET中CKEditor与CKFinder的配置使用
- asp(Parameters) 参数化实现方法
- ASP.NET中集成百度编辑器UEditor
- asp.net实现文件无刷新上传方法汇总
- ASP.Net刷新页面后自动滚动到原来位置方法汇总
- Asp.net 2.0 无刷新图片上传 显示缩略图 具体实现