2009-08-10 13 views
4

私はdatagridviewをデータテーブルからバインドしています。私は計算された列linetotalその倍数unitprice *数量を持っています。winforms datagridview計算フィールド変更イベント

また、私はdatagridviewのlinetotal列の合計を格納したいと思うtotalpriceラベルを持っています。

ユーザーがunitpriceまたはquantityを変更すると、その行のlinetotalが更新され、totalpriceラベルがlinetotal列を合計する必要があります。

totalpriceラベルを計算するために使用する正しいイベントが見つからないようです。私はcellvaluechanged、currentcelldirtystatechanged、rowleaveを試した。それらのどれも正しく動作していないようです。私はすべての列が計算された後に発生するイベントが必要だと思います。

私の擬似コード:

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 
} 

火災が計算された列の値が変更されていることをいくつかのイベントが存在しなければなりません。

答えて

1

計算された列がDataTableの一部であり、DataGridViewの一部ではないという事実に起因するようです。私は、DataGridViewがdgvの基礎となるデータソースが変更されるたびにイベントを公開するかどうかはわかりません。 DataGridView.DataSourceChangedイベントがありますが、実際にDataSourceプロパティを設定したときに発生するように見えるだけで、DataTableが計算で変更された場合は発生しません。

コードの構造を変更せずに動作させたい場合は、DataTableのRowChangedイベントを購読し、dgvをスキャンしてそこからラベルを更新することができます。これはまったくクリーンなソリューションではありませんが、機能します。私はDataGridViewの計算された列に切り替えることを検討します。

0

通常、私はそれらを与える前に私の答えを試していますが、私はdevのPCから離れているので、私は100%ルートが最も良いとは思っていませんが、ここに試してみてください。

DataGridViewでは、CellEndEditイベントを使用して、セルがいつ編集されたかを知ることができます。 CellLeaveイベントもありますが、私はそれを使用していないため、実験する必要があります。

DataGridでは、CurrentCellChangedイベントを使用できます。

しかし、計算を行うには、コントロールがバインドされているものに応じて、基礎となるDataableまたはDataViewの値を抽出する必要があります。また、DataGrid.CurrentCellChangedイベントを使用するとバグが発生し、ユーザーがコンテンツを編集するときだけでなく、DataGridがデータバウンドされたときにスローされることがわかりました。そのために対処する必要があります... DataGridViewのCellLeaveイベントに同様の問題がある可能性があります。私が言ったように、私は100%確実ではないので、実験する必要があります。

また、Kyle氏が示唆しているように、基になるDataSourceのイベントを使用することもできます。

DataTable.RowChangedイベントまたはDataView.ListChangedイベントが開始されます。

私が言ったように、私はこれらを自分でテストすることはできませんが、これらのアイデアの1つが正しい方向に向かうことを願っています。

1

計算されたデータ列を更新する必要があるたびに、再度expereionの割り当てを使用してください。わたしにはできる。私のコードのすべてのあなたが必要だ

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); 
} 

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

verbiグレーシア!

関連する問題