2011-07-31 7 views
0

DataTableを複数の小さなデータテーブルに分割する方法を記述しました。しかし、私は例外を得ています。どうすれば修正できますか?コードを共有してください。パラメータ付きデータテーブル分割

例外メッセージ:

この行には既に別のテーブルに属します。

フレームワーク:.NET 3.0

private static List<DataTable> SplitDataTable(DataTable dt, int size) 
{ 
    List<DataTable> split = new List<DataTable>(); 
    DataTable current = dt.Clone(); 
    int iterator = 0; 
    foreach (DataRow dr in dt.Rows) 
    { 
     iterator = iterator + 1; 
     if (iterator == size) 
     { 
      current = dt.Clone(); 
      split.Add(current); 
      iterator = 0; 
     } 
     current.Rows.Add(dr); 
     //Exception: This row already belongs to another table. 
    } 
    return split; 
} 

クライアント:

static void Main(string[] args) 
{ 
    DataTable dt = new DataTable(); 
    dt.Columns.Add("TEST", typeof(int)); 
    dt.Columns.Add("VAL", typeof(string)); 
    dt.Rows.Add(0,"a"); 
    dt.Rows.Add(1,"b"); 
    dt.Rows.Add(2,"c"); 
    dt.Rows.Add(3,"d"); 

    List<DataTable> split = SplitDataTable(dt, 2); 
} 

答えて

0

あなたはDataTableのソースからのDataRowを削除したり、新規のDataRowを作成し、新しいデータテーブルに追加することができます。代わりにdt.Clone();

1

使用dt.Copy();あなたがクローン化されたデータテーブルにDataRowを追加する前に、あなたがデータテーブル元のソースからそれを削除する必要があります。

foreach (DataRow dr in dt.Rows) 
{ 
    iterator = iterator + 1; 

    if (iterator == size) 
    { 
     current = dt.Clone(); 
     split.Add(current); 
     iterator = 0; 
    } 

    dt.Rows.Remove(dr); // remove it from the source FIRST, then add it to the cloned DataTable 
    current.Rows.Add(dr); 
} 
1

0

あなただけの行を変更する必要があります現在のデータテーブルにデータ行を追加します。オーバーレイを使用してオブジェクト配列を取得し、新しい行を作成します。この方法では、新しい行を作成する代わりに、行を複製またはコピーすることはありません。

current.Rows.Add(dr.ItemArray); 
1

使用current.ImportRow(dr);代わり

0

current.Rows.Add(dr);のは、私はあなたがそれは大丈夫

private static List<DataTable> SplitDataTable(DataTable dt, int size) 
{ 
    List<DataTable> split = new List<DataTable>(); 
    DataTable current = dt.Clone(); 

    int iterator1 = 0; 
    foreach (DataRow dr in dt.Rows) 
    { 
     if (current.Rows.Count < size) 
     { 
      current.Rows.Add(dr.ItemArray); 

     } 
     if (current.Rows.Count == size) 
     { 
      iterator1= iterator1+size; 
      split.Add(current); 
      current = dt.Clone(); 
     } 
    } 
    if (iterator1 < dt.Rows.Count) { split.Add(current); } 
    return split; 
} 

幸せcodding

作業のコードで正常に動作しません。この機能は、私はいくつかの変更を行うこの を試してみてくださいだと思います
関連する問題