如何在不使用c#中的linq的情况下使用特定id将数据表拆分为多个数据表?

时间:2015-06-18 16:27:21

标签: c# asp.net datatable dataset datarow

我想将单个DataTable拆分为多个DataTable

Table1包含clientid,clientname

  

(1,客户端1)(1,客户端2)(1,client3)(2,client4)(2,客户机程序)

我想将此表拆分为

  

table2 =(1,client1)(1,client2)(1,client3)

  

table3将有(2,client4)(2,client5)。

相同的clientid DataRow将移至单独的DataTable。我怎么能这样做?

我试过了,但它没有用。我想在c#中没有linq的情况下这样做。如何在不使用c#中的linq的情况下使用特定id将数据表拆分为多个数据表?

foreach (DataRow row in dsBindSubCategory.Tables[0].Rows)
{
    DataRow newRow = newDt.NewRow();
    newRow.ItemArray = row.ItemArray;
    newDt.Rows.Add(newRow);
    i++;

    if (Convert.ToInt32(dsBindSubCategory.Tables[0].Rows[i]["ClientId"]) != Convert.ToInt32(dsBindSubCategory.Tables[0].Rows[i - 1]["ClientId"]))
    {
        newDs.Tables.Add(newDt);
        j++;
        newDt = dsBindSubCategory.Tables[0].Clone();
        newDt.TableName = "Table_" + j;
        newDt.Clear();
        i = 0;
    }
}

return newDs;

2 个答案:

答案 0 :(得分:0)

以下代码将从一个数据表创建两个数据表。请注意,我也在代码中创建原始表,因为我无法访问您的数据源。

    DataTable table = new DataTable();

    DataColumn col1 = new DataColumn("clientid");
    DataColumn col2 = new DataColumn("clientname");

    col1.DataType = System.Type.GetType("System.Int32");
    col2.DataType = System.Type.GetType("System.String");

    table.Columns.Add(col1);
    table.Columns.Add(col2);

    DataRow r = table.NewRow();
    r[col1] = 1;
    r[col2] = "client 1";
    table.Rows.Add(r);
    r = table.NewRow();
    r[col1] = 1;
    r[col2] = "client 2";
    table.Rows.Add(r);
    r = table.NewRow();
    r[col1] = 2;
    r[col2] = "client 3";
    table.Rows.Add(r);

    // Create two new data tables
    DataTable dt1 = new DataTable("t1");
    DataTable dt2 = new DataTable("t2");
    // Make the columns of the new tables match the existing table columns
    foreach(DataColumn dc in table.Columns)
    {
        dt1.Columns.Add(new DataColumn(dc.ColumnName, dc.DataType));
        dt2.Columns.Add(new DataColumn(dc.ColumnName, dc.DataType));
    }

    foreach (DataRow row in table.Rows)
    {
        int id = Convert.ToInt32(row["clientid"]);
        if (id == 1)
        {
            DataRow dr = dt1.NewRow();
            dr.SetField("clientid", row["clientid"]);
            dr.SetField("clientname", row["clientname"]);
            dt1.Rows.Add(dr);
        }
        else
        {
            DataRow dr = dt2.NewRow();
            dr.SetField("clientid", row["clientid"]);
            dr.SetField("clientname", row["clientname"]);
            dt2.Rows.Add(dr);
        }
    }
}

所以,显然这只创建了两个表。由于您的评论表明您希望每个唯一ID有多个新数据表,因此您需要使用以下代码:

    DataTable newTable= new DataTable();
    // Make the columns of the new tables match the existing table columns
    foreach(DataColumn dc in table.Columns)
    {
        newTable.Columns.Add(new DataColumn(dc.ColumnName, dc.DataType));
        newTable.Columns.Add(new DataColumn(dc.ColumnName, dc.DataType));
    }

每次遍历源表中的行并找到新的clientid。你可能想要某种id和一个新的结果表字典来跟踪事物。如果您需要更多细节,我可以尝试编写一个更完整的示例,但概念是相同的。

答案 1 :(得分:0)

您可以创建DataView并将它们复制到dataTables:

DataView DataView1 = new DataView(table,"ClientId=1","ClientId ASC", DataViewRowState.CurrentRows);
DataTable dt1 = DataView1.Table.Clone();