2017-08-09 18 views
0

私は、以下のこのソリューションを試みた:私は597列と20行を含むDataTableを持っており、データをExcelにエクスポートしようとしている行を追加しようとすると、すでに行が別の表エラーに属していますか?

This Row already belongs to another table error when trying to add rows?

を。ただし、Excelの最大列数は256です。したがって、エクスポートを行うには、ソースデータを3つのデータテーブルに分割する必要があります。

以下は私が書いたコードです。その後

var dtmasterdata = data.Tables[name]; 

for (int j = 1; j < datatableNumberCount; j++) 
         { 
          DataTable dt2 = new DataTable(); 
          dt2.TableName = "Master_" + j; 
          dt2 = dtmasterdata.Copy(); 

          foreach (DataColumn col in dtmasterdata.Columns) 
          { 
           DataColumn dtcol = new DataColumn(); 
           dtcol = col; 
           dt2.Columns.Add(dtcol.ColumnName, dtcol.DataType); 
          } 

          for (int k = 0; k < dtmasterdata.Rows.Count; k++) 
          { 
           DataRow dr = dt2.NewRow(); 
           dr = dtmasterdata.Rows[k]; 
           dt2.ImportRow(dtmasterdata.Rows[k]); 
           //dt2.Rows.Add(dr.ItemArray); 
          } 

私は以下のようないくつかの列を削除する必要があると私は3つのDataTable

foreach (DataColumn col in dtmasterdata.Columns) 
          { 
           if (j == 1) 
           { 
            // condition 1 
            if (col.Ordinal >= 255) 
            { 
             dt2.Columns.RemoveAt(col.Ordinal); 
            } 
           } 

           if (j == 2) 
           { 
            // condition 2. 
            if (col.Ordinal < 255 || col.Ordinal >= 510) 
            { 
             dt2.Columns.RemoveAt(col.Ordinal); 
            } 
           } 

           if (j == 3) 
           { 
            // condition 3. 
            if (col.Ordinal <= 510 || col.Ordinal >= 765) 
            { 
             dt2.Columns.Add(col); 
            } 
           } 
          } 

int worksheetNumber = 1; 
          string worksheetNameWithNumber = "Master Data"; 
          if (worksheetNumber > 1) 
           worksheetNameWithNumber = String.Format("{0}_{1}", ws1, worksheetNumber.ToString()); 
          Infragistics.Excel.Worksheet worksheet = wb.Worksheets.Add(worksheetNameWithNumber); 
          Infragistics.WebUI.UltraWebGrid.UltraWebGrid masterData1 = new Infragistics.WebUI.UltraWebGrid.UltraWebGrid("masterDataGrid"); 
          masterData1.Browser = Infragistics.WebUI.UltraWebGrid.BrowserLevel.UpLevel; 
          masterData1.DataSource = dt2; 
          masterData1.DataMember = "Master_" + j; 
          masterData1.DisplayLayout.HeaderStyleDefault.Font.Bold = true; 
          masterData1.DisplayLayout.HeaderStyleDefault.Font.Name = "Arial"; 
          masterData1.DisplayLayout.HeaderStyleDefault.Font.Size = FontUnit.Parse("10px"); 
          masterData1.DisplayLayout.HeaderStyleDefault.BackColor = System.Drawing.Color.LightGray; 
          masterData1.DisplayLayout.RowStyleDefault.Font.Name = "Arial"; 
          masterData1.DisplayLayout.RowStyleDefault.Font.Size = FontUnit.Parse("10px"); 
          Infragistics.WebUI.UltraWebGrid.UltraGridBand masterBand1 = new Infragistics.WebUI.UltraWebGrid.UltraGridBand(); 
          masterData1.Bands.Add(masterBand1); 
          dgResults.Controls.Add(masterData1); 
          masterData1.DataBind(); 
          wb.ActiveWorksheet = worksheet; 
          this.ugWebGridExporter.Export(masterData1, worksheet); 
          worksheetNumber++; 
+0

@kapli上でLINQを使用して、このように進めることができます - あなたはこれに対する私の答えを見ましたか? – Wheels73

答えて

2

を作成したいあなたはすでにあなたに属しているのDataTableに列を追加しようとしているので、あなたの誤差がありますソースデータテーブル。

dt2.Columns.Add(col); 

データテーブルの列を繰り返し処理して別のデータテーブルに追加するだけではできません。

私は、ソースデータを複製して不要なものを削除するという方法をとっています。

最初に、必要なデータテーブルを3つ作成します。以下は、596個の列を持つ私自身のソーステーブルを作成する私の例です。クローンはデータテーブル構造だけを取りますが、データはありません。

var source597ColsTable = new DataTable("Source"); 

for (var i = 0; i <= 596; i++) 
{ 
    source597ColsTable.Columns.Add(new DataColumn("Column" + i , typeof(string))); 
} 

DataRow newRow = source597ColsTable.NewRow(); 
source597ColsTable.Rows.Add(newRow); 

var cols0To199Table = source597ColsTable.Clone(); 
var cols200To399Table = source597ColsTable.Clone(); 
var cols400To596Table = source597ColsTable.Clone(); 

次に、ソーステーブルのすべての行をクローンにコピーします。以下は簡単な関数です。

private DataTable CopyRowsFromSource(DataTable sourceTable, DataTable destinationTable) 
    { 
    foreach (DataRow row in sourceTable.Rows) 
    { 
     destinationTable.Rows.Add(row.ItemArray); 
    } 

     return destinationTable; 
    } 

次に、各テーブルに対してこの関数を呼び出します。

cols0To199Table = CopyRowsFromSource(source597ColsTable, cols0To199Table); 
    cols200To399Table = CopyRowsFromSource(source597ColsTable, cols200To399Table); 
    cols400To596Table = CopyRowsFromSource(source597ColsTable, cols400To596Table); 

最後に、データテーブルからすべての列を削除して分割します。

private DataTable RemoveColumns(DataTable table, int startCol, int endCol) 
{ 
     var colsToRemove = new List<DataColumn>(); 

     for (var colCount = startCol; colCount <= endCol; colCount++) 
     { 
      colsToRemove.Add(table.Columns[colCount]); 
     } 

     foreach (DataColumn col in colsToRemove) 
     { 
      table.Columns.Remove(col); 
     } 

     return table; 
} 

次に、クローン化されたテーブルごとに再び..を呼び出します。

cols0To199Table = RemoveColumns(cols0To199Table, 200, 596); 

cols200To399Table = RemoveColumns(cols200To399Table, 0, 199); 
cols200To399Table = RemoveColumns(cols200To399Table, 200, 396); 

cols400To596Table = RemoveColumns(cols400To596Table, 0, 399); 

これを実行すると、0-199,200-399,400-596の3つのデータセットが作成されます。

希望に役立ちます。

1

実際にすべてのコードを理解しているかどうかはわかりませんが、別のデータテーブルに列のサブセットをコピーするには、DataViewクラスのToTableという非常に簡単なメソッドがあります。表。加えて、このメソッドは元のテーブルの20行のデータもコピーします。

これらの列をメソッドにリストするのは難しいことです。

あなたはDataColumnのコレクション

string[] firstCols = dtmasterdata.Columns 
         .Cast<DataColumn>() 
         .Take(255) 
         .Select(x => x.ColumnName).ToArray(); 
string[] secondCols = dtmasterdata.Columns 
          .Cast<DataColumn>() 
          .Skip(255) 
          .Take(255) 
          .Select(x => x.ColumnName).ToArray(); 
string[] thirdCols = dtmasterdata.Columns 
         .Cast<DataColumn>() 
         .Skip(510) 
         .Select(x => x.ColumnName).ToArray(); 

DataTable t1 = dtmasterdata.DefaultView.ToTable("Master_1", false, firstCols); 
DataTable t2 = dtmasterdata.DefaultView.ToTable("Master_2", false, secondCols); 
DataTable t3 = dtmasterdata.DefaultView.ToTable("Master_3", false, thirdCols); 
関連する問題