我要合并两个DataTable格式如下。
Dt1
-----------
aaaaa Dt1中的行ccccc Dt1中的行
Dt2
----------
bbbbbbb Dt2中的行ddddddd Dt2中的行
所要得到的结果是。
新的DataTableaaaaa
bbbbb
ccccc
ddddd交叉放入一个新的DataTable
谢谢各位帮忙。
Dt1
-----------
aaaaa Dt1中的行ccccc Dt1中的行
Dt2
----------
bbbbbbb Dt2中的行ddddddd Dt2中的行
所要得到的结果是。
新的DataTableaaaaa
bbbbb
ccccc
ddddd交叉放入一个新的DataTable
谢谢各位帮忙。
http://msdn2.microsoft.com/zh-cn/library/system.data.datatable.merge(VS.80).aspx
语句不一定对啊
for(int i=0;i<Dt1.Rows.Count;i++)
{
Dt3.Rows[2*i]=Dt1.Rows[i].ToString();
}
for(int i=0;i<Dt1.Rows.Count;i++)
{
Dt3.Rows[2*i+1]=Dt1.Rows[i].ToString();
}这样不行,就先把值交叉存在一个数组里,然后再循环赋值给 Dt3
<ItemTemplate>
<%#Eval("text") %><br />
</ItemTemplate>
</asp:Repeater> protected void Page_Load(object sender, EventArgs e)
{
///第一个表
DataTable dt1 = new DataTable(); DataColumn col1 = new DataColumn("text", Type.GetType("System.String")); dt1.Columns.Add(col1); DataRow row11 = dt1.NewRow(); row11["text"] = "aaaaaaaaa"; dt1.Rows.Add(row11);
DataRow row12 = dt1.NewRow(); row12["text"] = "cccccccccc"; dt1.Rows.Add(row12); ///第二个表
DataTable dt2 = new DataTable();
DataColumn col2 = new DataColumn("text", Type.GetType("System.String")); dt2.Columns.Add(col2);
DataRow row21 = dt2.NewRow(); row21["text"] = "bbbbbbbbbbb"; dt2.Rows.Add(row21);
DataRow row22 = dt2.NewRow(); row22["text"] = "ddddddddddddd"; dt2.Rows.Add(row22);
////第三个表 DataTable dt3 = new DataTable(); DataColumn col31 = new DataColumn("text", Type.GetType("System.String")); dt3.Columns.Add(col31); int rowCount1 = dt1.Rows.Count;
int rowCount2 = dt2.Rows.Count;
int totalCount=rowCount1+rowCount2;
int ctr = 0;
bool flag = true; for (int i = 0; i < totalCount; i++)
{
DataRow row31 = dt3.NewRow(); if (flag)
{
row31["text"] = dt1.Rows[ctr]["text"].ToString();
flag = false;
}
else
{
row31["text"] = dt2.Rows[ctr]["text"].ToString();
ctr = 1;
flag = true;
} dt3.Rows.Add(row31);
}
repeater1.DataSource = dt3;
repeater1.DataBind();
}
aaaaa
bbbbb
ccccc
ddddd
如果你调用dt1.Merge(dt2);方法,得到的结果是:aaaaa
ccccc
bbbbb
ddddd
{
arylist.Add(dr);
arylist.Add(null);
}
int i=0;
foreach (DataRow dr in Dt2 )
{
i=2*i+1;
arylist.Remove(i);
arylist.Insert(i,dr);
}for(int i=0;i<arylist.Count;i++)
{
DataRow dr =(DataRow)arylist[i];
....
往你新表里边插。
}
for(int i= 0;i<sourceRows.Length;i++)
{
dt1.ImportRow(sourceRows[i]);
}
表1
列1 列2 列3 .........
a a a
c c c
表2
列1 列2 列3 .........
b b b
d d d合并后的表
表3
列1 列2 列3 .........
a a a
b b b
c c c
d d d
我这有个ID被约束着..
把ctr = 1;
改为 ctr++;
改改成这样 for (int i = 0; i < totalCount; i++)
{
DataRow row31 = dt3.NewRow(); if (flag)
{
row31["text"] = dt1.Rows[ctr]["text"].ToString();
row31["列2"] = dt1.Rows[ctr]["text"].ToString();
row31["列3"] = dt1.Rows[ctr]["text"].ToString(); flag = false;
}
else
{
row31["text"] = dt2.Rows[ctr]["text"].ToString();
row31["列2"] = dt2.Rows[ctr]["text"].ToString();
row31["列3"] = dt2.Rows[ctr]["text"].ToString();
ctr++;
flag = true;
} dt3.Rows.Add(row31);
}
能不能把repeater 去掉?我只要获得DT3就可以了。
{
DataRow row31 = dt3.NewRow(); if (flag)
{
row31["text"] = dt1.Rows[ctr]["text"].ToString();
row31["列2"] = dt1.Rows[ctr]["text"].ToString();
row31["列3"] = dt1.Rows[ctr]["text"].ToString(); flag = false;
}
else
{
row31["text"] = dt2.Rows[ctr]["text"].ToString();
row31["列2"] = dt2.Rows[ctr]["text"].ToString();
row31["列3"] = dt2.Rows[ctr]["text"].ToString();
ctr++;
flag = true;
} dt3.Rows.Add(row31);
}
我把你的方法试了下。
我把主键去了。不过得到的结果是:
Dt1
------------
Dt2
这样显示的。没有交叉显示- -
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
BindRepeater();
} //绑定Repeater控件用DataTable
private void BindRepeater()
{
DataTable dt1 = new DataTable();
DataColumn dc11 = new DataColumn("text", Type.GetType("System.String"));
dt1.Columns.Add(dc11); DataRow dr11 = dt1.NewRow();
dr11["text"] = "aaaaaa";
dt1.Rows.Add(dr11); DataRow dr12 = dt1.NewRow();
dr12["text"] = "cccccc";
dt1.Rows.Add(dr12); DataTable dt2 = new DataTable();
DataColumn dc21 = new DataColumn("text",Type.GetType("System.String"));
dt2.Columns.Add(dc21); DataRow dr21 = dt2.NewRow();
dr21["text"]="bbbbbb";
dt2.Rows.Add(dr21); DataRow dr22 = dt2.NewRow();
dr22["text"] = "dddddd";
dt2.Rows.Add(dr22); DataTable dt3 = new DataTable();
DataColumn dc3 = new DataColumn("text", Type.GetType("System.String"));
dt3.Columns.Add(dc3); int dt1count = dt1.Rows.Count;
int dt2count = dt2.Rows.Count;
int total = dt1count + dt2count;
bool flag = true;
for (int i = 0; i < total; i++)
{
DataRow dr = dt3.NewRow();
if (flag)
{
dr["text"] = dt1.Rows[(int)(0.5 * i)]["text"];
flag = false;
}
else
{
dr["text"] = dt2.Rows[(int)(0.5 * (i-1))]["text"];
flag = true;
} dt3.Rows.Add(dr);
}
Repeater1.DataSource = dt3;
Repeater1.DataBind();
}
}
SELECT 列1, 列2, 列3 FROM 表1
UNION ALL
SELECT 列1, 列2, 列3 FROM 表2
1, 新建一个dt3,
//我假设你已去掉了主健DataRow[] sourceRows2 = dt2.Select();
DataRow[] sourceRows1 = dt1.Select();
int k=sourceRow2.Length
if(k<sourceRow1.Length) k=sourceRow1.Length;for(int i= 0;i<k;i++)
{
if(sourceRow1.Length>=i) dt3.ImportRow(sourceRows1[i]);
if(sourceRow2.Length>=i) dt3.ImportRow(sourceRows2[i]);
}
2,直接在SQL中排好输出到datatable
设你有二table(数据表的table), t1和t2,表结构相同.
declare @t1 table(v varchar(10))
insert @t1 select 'aa' union all select 'bb' union all select 'cc'
declare @t2 table(v varchar(10))
insert @t2 select 'xx' union all select 'yy' union all select 'zz' union all select 'mm'那么现在 @t1 有
aa
bb
cc
@t2有
xx
yy
zz
mm
希望得到
aa
xx
bb
yy
cc
zz
mm
这样的结果集
那么SQL中常见的处理方法是, 对每个表中的行都有一个连续的排序值, 两个表按这个列进行一一对应.
也即呈现
@t1
1 aa
2 bb
3 cc
@t2
1 xx
2 yy
3 zz
4 mm
那么常用的作法是 用
select v ,identity(int) id into #t1 from @t1
select v ,identity(int) id into #t2 from @t1
生成identity种子列, 然后
select v,pri=0 from #t1
union all
select v,pri=1 from #t2
order by id,pri --按identity列排序, 那么#t1,#t2都有id=1的列,当id相同时,再看优先级,即pri列,t1中的第一行排在t2的第一行之前如果是在sql 2005 中,可以直接用row_number(), 不用生成临时表以获得标识列.如果原表: t1,t2已含id 标识列,但id不连续
那么除了利用临时表生成identity列外,还可以用count计数法,写法如下
--假设t1,t2均有id列,id int identity(1,1) ,但是中间可能进行过数据删除,因此id不连续
select v,idx=(select count(*) from t1 where id<a.id),pri=0 from t1 a
union all
select v,idx=(select count(*) from t2 where id<a.id),pri=0 from t2 a
order by idex,pri3,给dt1,dt2,新加列,然后加入到dt3,用dataview进行排序
思路的来源,是从第二种方法来的.
第二种方法,是给每个表的每个行找到一个identity列.
那么本身在 datatable的rows集合中,rows本身就有index的,也即集合中某行的下标.比如 dt1.Rows[i];
给dt1,dt2,新加Column 名为 index, 每行的值为 行的下标.给dt1加新列,名为pri,值为0, dt2加新列,名为pri,值为1
然后直接用 Merge 方法,加到dt3
这样,dt3中,并没有进行排序. 而排序操作交给 dataview来进行.
dataview1.sort="index,pri";4, 合并为xml,用xslt来排. 扯远了
DataRow[] sourceRows1 = dt1.Select();
int k=sourceRow2.Length
if(k<sourceRow1.Length) k=sourceRow1.Length;for(int i= 0;i<k;i++)
{
if(sourceRow1.Length>=i) dt3.ImportRow(sourceRows1[i]);
if(sourceRow2.Length>=i) dt3.ImportRow(sourceRows2[i]);
}这个我获得的dt3是空的为什么呢?
快了快了就要成功了
我变量名都写错了.
DataRow[] sourceRows2 = dt2.Select();
DataRow[] sourceRows1 = dt1.Select();
这里定义的 sourceRows2,sourceRows1有个s,后面的没有
dt3 null
public DataTable IsEqual(DataTable dt1, DataTable dt2)
{
//dt1.PrimaryKey = null;
//dt2.PrimaryKey = null; DataRow[] sourceRows2 = dt2.Select();
DataRow[] sourceRows1 = dt1.Select();
int k = sourceRows2.Length;
if (k < sourceRows1.Length)
{
k = sourceRows1.Length;
}
dt3.Clear();
for(int i= 0;i<k;i++)
{
if (sourceRows1.Length >= i)
{
dt3.ImportRow(sourceRows1[i]);
} if (sourceRows2.Length >= i)
{
dt3.ImportRow(sourceRows2[i]);
}
}
return dt3; }
{
DataTable max;
DataTable min; if (dt1.Rows.Count >= dt2.Rows.Count)
{
max = dt1;
min = dt2;
}
else
{
max = dt2;
min = dt1;
}
int k = 1;
DataRow dr;
for (int i = 0; i < min.Rows.Count; i++)
{
dr = max.NewRow();
for (int j = 0; j < min.Columns.Count; j++)
{
dr[j] = min.Rows[i][j];
}
max.Rows.InsertAt(dr, k);
k++;
}
return max;
}
dt.ImportRow();用这个方法因该可以解决,而且很效率
比如说开发出一款可以切换到使用UDP协议上网的浏览器,这个浏览器使用UDP协议上网,DX的限制不是就自动解除了吗?好了,幻想完了,高手们看看,能不能实现啊?