2016-04-22 24 views
0

Ich versuche, Ergebnisse von einer Methode zu filtern, die eine DataTable um einen bestimmten Spaltenwert (vom Typ DateTime) zurückgibt und sie wie folgt in zwei verschiedene DataTables einfügt:Filtern von DataTable und Kopieren von Ergebnissen in zwei verschiedene DataTables

var vAllItems = myClass.GetAllResults(x,y,z); 
DataTable dtExpiredItems = new DataTable(); 
DataTable dtActiveItems = new DataTable(); 

var expiredItems = vAllItems.AsEnumerable().Where(r => r.Field<DateTime?>("ExpDate") <= DateTime.Now && r.Field<DateTime?>("ExpDate").HasValue); 
var activeItems = vAllItems.AsEnumerable().Where(r => r.Field<DateTime?>("ExpDate") > DateTime.Now || !r.Field<DateTime?>("ExpDate").HasValue); 

foreach(DataRow row in expiredItems) 
    dtExpiredItems.Rows.Add(row); 

foreach (DataRow row in activeItems) 
    dtActiveItems.Rows.Add(row); 

rptExpiredItems.DataSource = dtExpiredItems; 
rptExpiredItems.Bind(); 
pchExpiredItems.Visible = dtExpiredItems.Rows.Count > 0; 

rptActiveItems.DataSource = dtActivetItems; 
rptActiveItems.Bind(); 
pchActiveItems.Visible = dtActiveItems.Rows.Count > 0; 

Sache ist, auf der zweiten foreach-Schleife der folgende Fehler auftritt:

This row already belongs to another table. 

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.ArgumentException: This row already belongs to another table. 

Jede Hilfe ist willkommen! Vielen Dank!

+0

DateTime.Now ständig() tun könnte, zu verändern. Sie möchten es vor Ihren Abfragen auf eine Variable setzen. Theoretisch sollten abgelaufene Items und aktive Items nicht dieselben Zeilen von vAllItems haben (außer wenn die DataTime null ist). Also ich denke, das Problem tritt wegen der Null DataTime auf. – jdweng

Antwort

1

Ein DataRow kann nur zu einem einzigen DataTable gehören, Sie sollten eine neue Zeile aus gegebenen Zeilenwerten erstellen.

Verwenden Sie ItemArray Eigenschaft der DataRow, Werte abzurufen und object[] als eine Eingabe zu übergeben, um neue Zeile zu erstellen.

dtExpiredItems.Rows.Add(row.ItemArray); 

oder verwenden ImportRow

dtExpiredItems.ImportRow(row); 

Eine weitere Option CopyToDataTable (Datatable) Erweiterung wird mit von neuer Tabelle Linq Ausgabe zu erstellen, dann neue Tabelle verwendet für Ihre Bindung.

dtExpiredItems = expiredItems.CopyToDataTable<DataRow>(); 
+0

Danke Hari, als richtig markiert. Vor dem Aufrufen der CopToDataTable-Methode ist jedoch eine Überprüfung der Elementanzahl erforderlich! –

1

Wo Sie tun das folgende

dtExpiredItems.Rows.Add(row); 
dtActiveItems.Rows.Add(row); 

Sie stattdessen

dtExpiredItems.ImportRow(row); 
dtActiveItems.ImportRow(row);