我要合并两个DataTable格式如下。
Dt1
-----------
aaaaa  Dt1中的行ccccc  Dt1中的行
Dt2
----------
bbbbbbb   Dt2中的行ddddddd   Dt2中的行
所要得到的结果是。
新的DataTableaaaaa
bbbbb
ccccc
ddddd交叉放入一个新的DataTable
谢谢各位帮忙。

解决方案 »

  1.   

    比较笨的方法,遍历行 添加到table
      

  2.   

    Datatable.Merge(DateTable)方法
    http://msdn2.microsoft.com/zh-cn/library/system.data.datatable.merge(VS.80).aspx
      

  3.   

    这样应该可以吧 
    语句不一定对啊
    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 
      

  4.   

    你可以看看mapserver 提供的地址 , MSDN有方法我根据你的要求写了下.目的是拿分O_O        <asp:Repeater ID="repeater1" runat="server" >
                <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();
            }
      

  5.   

    以上代码得到你要的结果:
    aaaaa
    bbbbb
    ccccc
    ddddd
    如果你调用dt1.Merge(dt2);方法,得到的结果是:aaaaa
    ccccc
    bbbbb
    ddddd
      

  6.   

    笨一点的办法ArrayList arylist=new Arraylist();foreach (DataRow dr in Dt1 )
    {
       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];
       ....
       往你新表里边插。
    }
      

  7.   

    假设两个datatable的结构相同DataRow[] sourceRows = dt2.Select();
    for(int i= 0;i<sourceRows.Length;i++)
    {
        dt1.ImportRow(sourceRows[i]);
    }
      

  8.   

    MVP_Microsoft 可能我没表达清楚 我的两个DataTable 是通过EXCEL来获得的。两表结构完全相同字段也相同两表的行数也相同。每个表都有14个字段。我把他们传到了两个DataTable。现在要做的是合并他们。
    表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   
      

  9.   

    fcuandy列“Id”被约束为是唯一的。值“0”已存在。
    我这有个ID被约束着..
      

  10.   

    我写的不能帮你解决吗?表一表二是你自己通过EXCEL读来的。我写的例子是自己建的表一表二。如果不知道有多少行。但要交叉合并。上面的代码改一个地方。
    把ctr = 1;
    改为 ctr++;
      

  11.   

    噢,你可能是说多列的情况?
    改改成这样            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);
                }
      

  12.   

     by MVP_Microsoft 
    能不能把repeater 去掉?我只要获得DT3就可以了。
      

  13.   

     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);
                }
      

  14.   

    by  fcuandy 
    我把你的方法试了下。
    我把主键去了。不过得到的结果是:
    Dt1
    ------------
    Dt2
    这样显示的。没有交叉显示- -
      

  15.   

    using System;
    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();
        
        }
    }
      

  16.   

    用SQL直接从两个表中查询数据,然后插入新表中:INSERT INTO 表3 (列1, 列2, 列3)
    SELECT 列1, 列2, 列3 FROM 表1
    UNION ALL
    SELECT 列1, 列2, 列3 FROM 表2
      

  17.   

    请问SQL语句能直接操作DataTable吗,如果能的话给点源码也行呀。
      

  18.   

    new 一个新的DataTable然后遍历两个旧的DataTable,ImportRow()到新的
      

  19.   

    如果确实想交叉,那么应该要用循环来处理.可以用几种方法. 下面是随手敲的,难免手误
    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来排. 扯远了
      

  20.   

    我现在获得到的就是两个DtatTable。两个tb列数相同行数未知。我要做的是把两个tb放在一个tb里要交叉放。第一行放入tb1的第一行,第二行放入tb2的第一行....交叉放下去。- -
      

  21.   

    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]);
    }这个我获得的dt3是空的为什么呢?
    快了快了就要成功了
      

  22.   

    你不会是粘贴复制的吧, 那还会不报错?
    我变量名都写错了.
    DataRow[] sourceRows2 = dt2.Select(); 
    DataRow[] sourceRows1 = dt1.Select(); 
    这里定义的 sourceRows2,sourceRows1有个s,后面的没有
      

  23.   

    没有复制黏贴。也没有报错,我打了断点看了下dt3是空的。奇怪了。
    dt3 null
      

  24.   


        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;    } 
      

  25.   

            public DataTable TestDataTable(DataTable dt1, DataTable dt2)
            {
                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;
            }
      

  26.   

        DataTable dt = new DataTable();
            dt.ImportRow();用这个方法因该可以解决,而且很效率
      

  27.   

      首先声明,俺对软件开发一窍不通,只是一个想法而已。不知道在技术上是不是可以实现。  现在全国范围内的DX运营商都在对宽带上网用户进行限制,众多使用宽带路由器的网民都不能在浏览网页,从网上查了一下资料,似乎都是在TCP/IP协议上的限制,而使用UDP协议的软件,比如QQ等却不受影响,能不能开发出一款可以在使用时,自由的在TCP/IP、UDP、HTTP、ICMP、IGMP、DNS、ARP、DHCP、PPPoE等众多复杂网络协议间切换联网协议的软件呢?
    比如说开发出一款可以切换到使用UDP协议上网的浏览器,这个浏览器使用UDP协议上网,DX的限制不是就自动解除了吗?好了,幻想完了,高手们看看,能不能实现啊?