在项目开发中,我们有可能用到要将多个表进行重新组合的问题,就是将多个表中的内容只人每个表中的一列,组成一个新表,下面将就这个问题来进行解答,以备以后有用.下面的例子是从三个表中进行取列进行组合,也可以多表,要自己稍改动一下。表中的主键名称为id,数据列为item
一。先生成三个表备用,也可以从数据库中取
private DataTable dt1()
{
DataTable table1 = new DataTable("Items1");
//添加两列
DataColumn idColumn = new DataColumn("id", typeof(System.Int32));
DataColumn itemColumn = new DataColumn("item", typeof(System.Int32));
table1.Columns.Add(idColumn);
table1.Columns.Add(itemColumn);
//再加一列,用于测试,这一列在新表中不显示
table1.Columns.Add("itemValue", typeof(System.String));
table1.PrimaryKey = new DataColumn[] { idColumn };
DataRow row;
//加入测试行
for (int i = 1; i < 9; i=i+2)
{
row = table1.NewRow();
row["id"] = i;
row["item"] = i;
row["itemValue"] = "新加" + i.ToString();
table1.Rows.Add(row);
}
return table1;
}
private DataTable dt2()
{
DataTable table1 = new DataTable("Items2");
//添加新列
DataColumn idColumn = new DataColumn("id", typeof(System.Int32));
DataColumn itemColumn = new DataColumn("item", typeof(System.Int32));
table1.Columns.Add(idColumn);
table1.Columns.Add(itemColumn);
//再加一列,用于测试,这一列在新表中不显示
table1.Columns.Add("itemValue", typeof(System.String));
// 设置主键
table1.PrimaryKey = new DataColumn[] { idColumn };
// Add ten rows.
DataRow row;
for (int i = 2; i <= 10; i = i + 2)
{
row = table1.NewRow();
row["id"] = i;
row["item"] = i;
row["itemValue"] = "新加" + i.ToString();
table1.Rows.Add(row);
}
return table1;
}
private DataTable dt3()
{
DataTable table1 = new DataTable("Items3");
DataColumn idColumn = new DataColumn("id", typeof(System.Int32));
DataColumn itemColumn = new DataColumn("item", typeof(System.Int32));
table1.Columns.Add(idColumn);
table1.Columns.Add(itemColumn);
//再加一列,用于测试,这一列在新表中不显示
table1.Columns.Add("itemValue", typeof(System.String));
table1.PrimaryKey = new DataColumn[] { idColumn };
DataRow row;
for (int i = 8; i <= 10; i++)
{
row = table1.NewRow();
row["id"] = i;
row["item"] = i;
row["itemValue"] = "新加"+i.ToString();
table1.Rows.Add(row);
}
return table1;
}
二。从dataset(其中有可有多个不同的表)中生成一个新表的方法
/// <summary>
/// 遍历多个表生成一个新表
/// </summary>
/// <param name="ds">一个有多个表的集合,表可以各不相同,但主键名称要一样</param>
/// <returns></returns>
private DataTable newdatatable(DataSet ds)
{
//遍历多个表生成一个新表
DataTable newdt = new DataTable();//要填充的新表
DataColumn newcolumn;
newcolumn = new DataColumn("id",typeof(System.String));
newdt.Columns.Add(newcolumn);
//设置主键,如果不设会有重复
newdt.PrimaryKey = new DataColumn[] { newcolumn };
DataTable middt = new DataTable();//一个中间表
DataTable clonedt =newdt.Clone();//一个中间表,以便保存新表newdt的原始状态
for(int i=0;i<ds.Tables.Count;i++)
{
DataTable dt = new DataTable(i.ToString());
middt.Dispose();
dt = ds.Tables[i];
if (dt != null && dt.Rows.Count > 0)
{
//操作中间表
middt = clonedt.Clone();
//先加一列
middt.Columns.Add(i.ToString(), typeof(System.String));
Object[] midArray = new Object[2];
DataRow midrow;
foreach (DataRow dtrow in dt.Rows)
{
midrow = middt.NewRow();
midArray[0] = dtrow["id"];
midArray[1] = dtrow["item"];
midrow.ItemArray = midArray;
middt.Rows.Add(midrow);
}
}
//整合到新表中
newdt.Merge(middt, false, MissingSchemaAction.Add);
}
return newdt;
}
三。页面调用方法
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
//用来对比显示,用来对照是否正确
GridView1.DataSource = dt1();
GridView2.DataSource = dt2();
GridView3.DataSource = dt3();
GridView1.DataBind();
GridView2.DataBind();
GridView3.DataBind();
DataSet ds = new DataSet("myds");
ds.Tables.Add(dt1());
ds.Tables.Add(dt2());
ds.Tables.Add(dt3());
//这个也是一个gridview,绑定新的datatable
mergeView.DataSource = newdatatable(ds);
mergeView.DataBind();
}
}
//-------------------------------------Over-----------------------------------//
本文作者:网友 来源:网络 http://hi.baidu.com/net1979/