2009-04-06 3 views
157

Ich habe eine DataTable, die einige Zeilen hat und ich benutze die Auswahl, um die Zeilen zu filtern, um eine Sammlung von DataRows zu erhalten, die ich foreach durchlaufen und es zu einer anderen DataTable hinzufügen, aber es gibt mir den Fehler "This Row gehört schon zu einem anderen Tisch ". Hier ist der Code:Diese Zeile gehört bereits zu einem anderen Tabellenfehler beim Versuch, Zeilen hinzuzufügen?

DataTable dt = (DataTable)Session["dtAllOrders"]; 
DataTable dtSpecificOrders = new DataTable(); 

DataRow[] orderRows = dt.Select("CustomerID = 2"); 

foreach (DataRow dr in orderRows) 
{ 
    dtSpecificOrders.Rows.Add(dr); //Error thrown here. 
} 
+1

große Frage; Ich bin verwirrt über Zeilen und Tabellen, die zu anderen Containern gehören. –

Antwort

279

Sie benötigen eine neue mit den Werten aus dr zuerst zu erstellen. A DataRow kann nur zu einer einzigen DataTable gehören.

Sie können auch Add verwenden, die ein Array von Werten nimmt:

myTable.Rows.Add(dr.ItemArray) 

Oder wahrscheinlich noch besser:

// This works because the row was added to the original table. 
myTable.ImportRow(dr); 

// The following won't work. No data will be added or exception thrown. 
var drFail = dt.NewRow() 
drFail["CustomerID"] = "[Your data here]"; 
// dt.Rows.Add(row); // Uncomment for import to succeed. 
myTable.ImportRow(drFail); 
+5

Kann ich ImportRow als Alernativ verwenden? und warum würde .NET Ihnen nicht erlauben, die gleiche DataRow für verschiedene DataTables zu haben? Ist das Absicht? – Xaisoft

+0

Danke für das obige Snippet. Ich wollte gerade fragen, ob ich 100 Zeilen hätte, müsste ich alle ausschreiben? – Xaisoft

+3

Heh Ich habe gerade ImportRow realisiert, bearbeite meine Antwort und du schlägst mich alle dazu. Aber ja, ich würde diesen Ansatz empfehlen, da er die Zeile für Sie kopiert. – JoshBerke

20

Versuchen Sie folgendes:

DataTable dt = (DataTable)Session["dtAllOrders"]; 
DataTable dtSpecificOrders = dt.Clone(); 

DataRow[] orderRows = dt.Select("CustomerID = 2"); 

foreach (DataRow dr in orderRows) 
{ 
    dtSpecificOrders.ImportRow(dr); 
} 
+3

Vielen Dank dafür. Obwohl die Antwort von @JoshBerke korrekt war, müssen Sie die Originaltabelle wie in Ihrem Beispiel klonen, damit sie funktioniert. – carny666

7
yourTable.ImportRow(dataRow); 

Es ist, weil die Zeile, die du kopierst hat nicht die gleiche TableName:

Zum Beispiel versuchen:

Table1.TableName = "Table1"; 
Table2.TableName = "Table2"; 
+1

Ich hatte auch einen falsch benannten Tisch. Vielen Dank! – Bruno

1
foreach (DataRow dr in dtSpecificOrders.rows) 
{ 
    dtSpecificOrders.Rows.Add(dr.ItemArray); 
} 
+0

Ich glaube nicht, dass Sie dem, was Sie iterieren, irgendetwas hinzufügen können, während Sie es durchlaufen. – vapcguy

1

Warum Sie nicht einfach CopyToDataTable

DataTable dt = (DataTable)Session["dtAllOrders"]; 
DataTable dtSpecificOrders = new DataTable(); 

DataTable orderRows = dt.Select("CustomerID = 2").CopyToDataTable(); 
+1

Was soll orderRows hier sein? – Avi

+0

Eine neue DataTable der ausgewählten Zeilen von 'dt', Avi. – vapcguy

3

verwenden Dies ist nicht das sauberste/schnellste/einfachste/eleganteste Lösung, aber es ist eine brutale Kraft, die ich geschaffen habe, um die Arbeit in einem ähnlichen Szenario zu erledigen:

DataTable dt = (DataTable)Session["dtAllOrders"]; 
DataTable dtSpecificOrders = new DataTable(); 

// Create new DataColumns for dtSpecificOrders that are the same as in "dt" 
DataColumn dcID = new DataColumn("ID", typeof(int)); 
DataColumn dcName = new DataColumn("Name", typeof(string)); 
dtSpecificOrders.Columns.Add(dtID); 
dtSpecificOrders.Columns.Add(dcName); 

DataRow[] orderRows = dt.Select("CustomerID = 2"); 

foreach (DataRow dr in orderRows) 
{ 
    DataRow myRow = dtSpecificOrders.NewRow(); // <-- create a brand-new row 
    myRow[dcID] = int.Parse(dr["ID"]); 
    myRow[dcName] = dr["Name"].ToString(); 
    dtSpecificOrders.Rows.Add(myRow); // <-- this will add the new row 
} 

Die Namen in den DataColumns müssen mit denen in Ihrer Originaltabelle übereinstimmen, damit sie funktioniert. Ich habe nur "ID" und "Name" als Beispiele verwendet.

0

Sie können den Spalten eine ID geben und sie eindeutig benennen.

Verwandte Themen