2016-04-07 16 views
0

Ich möchte zwei Datentabellen subtrahieren. Was ich will, ist das unter Bild.wie zwei Datentabellen subtrahieren?

Here is the Image

Ich habe den folgenden Code, und ich in letzten Punkt gestapelt. Hier ist, was ich im Code machen möchte.

Wenn ich auf Button1 klicke, erhält es aktuelle Daten in firstDsData. Ein paar Sekunden später, wenn ich auf Button2 klicke, werden die aktuellen Daten in die secondDsData hochgeladen und zusammengeführt. Dann werden sie zu FinalDsData zusammengeführt. Differenzen Datentabelle erhalten die Änderungen von finaldsdata.

Das Problem ist im letzten Abschnitt. FinalDsData.GetChanges() funktioniert nicht. Es sagt nullreferenceexception. Ich habe auch versucht, Änderungen mit RowState.Unchanged/Modified() zu bekommen. Sie haben auch nicht funktioniert.

DataTable firstDsData = new DataTable(); 
    DataTable secondDsData = new DataTable(); 
    DataTable finalDsData = new DataTable(); 
    DataTable DifferenceDataTable = new DataTable(); 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     this.dataTable1TableAdapter.Fill(this.dataWE.DataTable1); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     firstDsData = dataTable1TableAdapter.GetData(); 

    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     secondDsData = dataTable1TableAdapter.GetData(); 

     finalDsData.Merge(firstDsData); 
     finalDsData.AcceptChanges(); 
     finalDsData.Merge(secondDsData); //Until here i can get data into finalDsData. No Problem. 
     DifferenceDataTable = finalDsData.GetChanges(); // Problem in here.Nullreferenceexception 
     ultraGrid2.SetDataBinding(DifferenceDataTable, DifferenceDataTable.TableName); 
    } 

Antwort

1

Wenn Ihr einziges Ziel ist es auf einem Raster Änderungen zu zeigen, dann können Sie LINQ verwenden wie Unterschied zwischen zwei Tabellen zu finden:

var changes = (from dr1 in firstDsData.AsEnumerable() 
    from dr2 in secondDsData.AsEnumerable() 
    where dr1.Field<string>("Name") == dr2.Field<string>("Name") 
    select new 
    { 
     Name = dr1.Field<string>("Name"), 
     Value = dr1.Field<decimal>("Value") - dr2.Field<decimal>("Value") 
    }).ToList(); 

es zu einem Raster zu zeigen, was Sie tun können:

ultraGrid2.DataSource = changes; 

Wenn Sie eine DataTable für die Ausgabe wollen, dann können Sie Ihre LINQ Ergebnisse in eine DataTable konvertieren, siehe Convert select new to DataTable?

+0

Ich änderte den Code wie folgt http://pastebin.com/Wkfkpjdw. Es wird ein Fehler ausgegeben, der besagt 'Eine nicht behandelte Ausnahme vom Typ' System.InvalidCastException 'in System.Data.DataSetExtensions.dll trat am Anfang des' Select new ' –

+0

@ P.Exal, kennen Sie den Datentyp der zweiten Spalte "Wert", ich nahm an, dass es sich um eine Dezimalzahl handelt, es könnte "double" oder "float" sein, überprüfe den Datentyp und ersetze ihn dann im obigen Code anstelle von "dezimal" – Habib

+0

danke habib. Es klappt. Ist es als Performance effizient, auf diese Weise zu arbeiten? Dieser Code läuft jede Sekunde. –