2009-08-10 10 views
4

Ich habe eine Datagridview von einer Datentabelle gebunden. Ich habe eine berechnete Spalten-Linienstückung, die ein Vielfaches der Einheitspreismenge ist.winforms datagridview berechnet Feldwechselereignis

Ich habe auch eine Gesamtpreislabel, die ich möchte die Summe der Linetotal Spalte in der Datagridview enthalten.

Wenn der Benutzer Änderungen am Einzelpreis oder an der Menge vornimmt, sollte das Linetotal für diese Zeile aktualisiert werden, und die Gesamtpreisbezeichnung sollte die Gesamtzeilenspalte summieren.

Ich kann nicht scheinen, das richtige Ereignis zu finden, das verwendet wird, um die Gesamtpreisbezeichnung zu berechnen. Ich habe versucht, cellvaluechanged, currentcelldirtystatechanged, rowleave. Keiner von ihnen scheint richtig zu funktionieren. Ich schätze, ich brauche ein Ereignis, das ausgelöst wird, nachdem alle Linesummenspalten berechnet wurden.

Mein Pseudo-Code:

dt = getallitems(itemnumber); 
dt.Columns.Add("LineTotal", typeof(double)); 
dt.Columns["Linetotal"].Expression = "[unitprice] * [quantity]"; 

dgv.DataSource = dt; 

private void dgv_WhatEventToUse???(object sender, DataGridViewCellEventArgs e) 
{ 
    //method to iterate the rows of the datagridview, and sum linetotal column 
} 

Es muss ein Ereignis sein, das ausgelöst wird, wenn der Wert der berechneten Spalte geändert wird.

Antwort

1

Es scheint, dass Ihr Problem von der Tatsache herrührt, dass Ihre berechnete Spalte Teil der DataTable und nicht Teil der DataGridView ist. Ich bin mir nicht sicher, ob DataGridView ein Ereignis für jedes Mal anzeigt, wenn sich die zugrunde liegende Datenquelle des dgv ändert. Es gibt ein DataGridView.DataSourceChanged-Ereignis, das jedoch nur scheinbar ausgelöst wird, wenn Sie die DataSource-Eigenschaft tatsächlich festlegen, und nicht, wenn sich die DataTable mit Ihren Berechnungen ändert.

Wenn Sie möchten, dass es funktioniert, ohne die Struktur Ihres Codes zu ändern, abonnieren Sie das RowChanged-Ereignis der DataTable, und Sie können den dgv scannen und Ihr Label von dort aktualisieren. Es ist nicht gerade eine saubere Lösung, aber es funktioniert. Ich würde erwägen, zu einer berechneten Spalte in der DataGridView zu wechseln, wenn das eine Option ist.

0

Normalerweise teste ich meine Antworten, bevor ich sie gebe, aber ich operiere weg von meinem Entwickler-PC, also bin ich nicht 100% sicher, welche Route am besten ist, aber hier sind einige Ideen zum Ausprobieren.

In einem DataGridView können Sie das Ereignis CellEndEdit verwenden, um zu erkennen, wann eine Zelle bearbeitet wurde. Es gibt auch einen CellLeave Event, aber ich habe es nicht benutzt und muss vielleicht damit experimentieren.

Auf einem DataGrid können Sie das Ereignis CurrentCellChanged verwenden.

Um Berechnungen durchzuführen, müssen Sie jedoch Ihre Werte aus dem zugrunde liegenden Datable oder DataView extrahieren (abhängig davon, an welches Steuerelement das Steuerelement gebunden ist). Ich habe auch festgestellt, dass die Verwendung des DataGrid.CurrentCellChanged-Ereignisses fehlerhaft ist, und es wird geworfen, wenn das DataGrid-Databound ist, nicht nur wenn ein Benutzer den Inhalt bearbeitet, also müssen Sie möglicherweise damit zu kämpfen ... Ich würde mir CellLeave von DataGridView vorstellen Event könnte ähnliche Probleme haben. Wie gesagt, ich bin mir nicht 100% ig sicher, also musst du experimentieren.

Auch, wie Kyle vorgeschlagen hat, könnten Sie versuchen, Ereignisse von der zugrunde liegenden DataSource zu verwenden.

DataTable.RowChanged oder DataView.ListChanged Ereignisse wäre wo ich anfangen würde.

Wie gesagt, ich kann diese selbst nicht testen, aber hoffentlich wird eine dieser Ideen Sie in die richtige Richtung weisen.

1

Jedes Mal, wenn Sie die berechnete Datenspalte aktualisieren müssen, verwenden Sie einfach erneut die Zuweisung von expresion. Für mich geht das.

dt.Columns["Linetotal"].Expression = "[unitprice] * [quantity]" 

verbi gratia in meinem Code

private void malla18_Mask_Validated(object sender, EventArgs e) 
{ 
    analisis_Tabla_Lote.Columns["SUMA_MALLAS"].Expression = "100 - (Malla12 + Malla14 + Malla15 + Malla16 + Malla17 + Malla18)"; 
    analisis_BindingSource.ResetBindings(false); 
} 

Das ist alles, was Sie brauchen!

Verwandte Themen