2010-10-26 37 views

risposta

192
foreach (DataRow dr in dataTable1.Rows) { 
    if (/* some condition */) 
     dataTable2.Rows.Add(dr.ItemArray); 
} 

L'esempio sopra presuppone che dataTable1 e dataTable2 hanno lo stesso numero, il tipo e l'ordine delle colonne.

+8

Non sarebbe questo risultato in "Questa fila appartiene già a altro tavolo" – McArthey

+8

@McArthey No, non lo sarebbe; una nuova riga viene creata dai valori nella riga esistente. La riga stessa non viene aggiunta all'altro DataTable. –

+0

Ciò si traduce in "L'array di input è più lungo del numero di colonne in questa tabella". – Vinod

14

Try This Copia

String matchString="ID0001"//assuming we have to find rows having key=ID0001 
    DataTable dtTarget = new DataTable(); 
    dtTarget = dtSource.Clone(); 
    DataRow[] rowsToCopy; 
    rowsToCopy = dtSource.Select("key='" + matchString + "'"); 
    foreach (DataRow temp in rowsToCopy) 
    { 
     dtTarget.ImportRow(temp); 
    } 
+0

Una buona risposta ma riduce le prestazioni. –

62

specificato righe dalla tabella all'altra

// here dttablenew is a new Table and dttableOld is table Which having the data 

dttableNew = dttableOld.Clone(); 

foreach (DataRow drtableOld in dttableOld.Rows) 
{ 
    if (/*put some Condition */) 
    { 
     dtTableNew.ImportRow(drtableOld); 
    } 
} 
8

check this out, può piacere (in precedenza, per favore, clonare table1 a tabella2):

table1.AsEnumerable().Take(recodCount).CopyToDataTable(table2,LoadOption.OverwriteChanges); 

oppure:

table1.AsEnumerable().Where (yourcondition ) .CopyToDataTable(table2,LoadOption.OverwriteChanges); 
1

sotto il campione sarebbe il modo più veloce per copiare una riga. ogni cella viene copiata in base al nome della colonna. nel caso non sia necessario copiare una cella specifica, quindi provare a catturare o aggiungere if. se stai andando a copiare più di 1 riga, quindi loop il codice qui sotto.

DataRow dr = dataset1.Tables[0].NewRow(); 
for (int i = 0; i < dataset1.Tables[1].Columns.Count; i++) 
{ 
    dr[dataset1.Tables[1].Columns[i].ColumnName] = dataset1.Tables[1].Rows[0][i]; 
} 

datasetReport.Tables[0].Rows.Add(dr); 

DataSet1.Tables [1] .Rows [] [i]; cambia l'indice 0 nel tuo indice di riga specificato o puoi usare una variabile se stai andando in loop o se sarà logico

4

Supportato in: 4, 3.5 SP1, ora puoi semplicemente chiamare un metodo sull'oggetto.

DataTable dataTable2 = dataTable1.Copy() 
+0

Tecnicamente questo crea una copia di un datatable. Sebbene non sia esplicitamente indicato nella domanda, è possibile che dataTable2 esista già e presenti altre righe che non vogliamo perdere. Inoltre, la domanda specifica specificamente "righe specifiche", mentre questo gestisce solo tutte le righe. – Matt

2

Come risultato degli altri posti, questo è il più corto ho potuto ottenere:

DataTable destTable = sourceTable.Clone(); 
sourceTable.AsEnumerable().Where(row => /* condition */).ToList().ForEach(row => destTable.ImportRow(row)); 
+0

Che è fondamentalmente un foreach. Inoltre, non stai filtrando attraverso una condizione, come richiesto dall'OP. –

+0

Ora, se elimino il 'sourceTable' anche il' destTable' sarà cancellato? – Si8

+0

Desidero poter assegnare un valore e cancellare la variabile originale senza cancellare la destinazione. – Si8

0
private void CopyDataTable(DataTable table){ 
    // Create an object variable for the copy. 
    DataTable copyDataTable; 
    copyDataTable = table.Copy(); 
    // Insert code to work with the copy. 
} 
+0

il tuo codice funziona perfettamente per me, è un codice molto semplice, grazie –