4

datatableからバインドされたdatagridviewがあります。単価*数量の倍数で計算された列のlinetotalがあります。

また、datagridviewのlinetotal列の合計を含めたいtotalpriceラベルもあります。

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

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

私の擬似コード:

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
}

計算された列の値が変更されたときに発生するイベントが発生する必要があります。

4

3 に答える 3

1

問題は、計算列がDataTableの一部であり、DataGridViewの一部ではないという事実に起因しているようです。dgvの基になるデータソースが変更されるたびにDataGridViewがイベントを公開するかどうかはわかりません。DataGridView.DataSourceChangedイベントがありますが、これは、DataTableが計算によって自動的に変更されるときではなく、実際にDataSourceプロパティを設定したときにのみ発生するようです。

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

于 2009-08-10T23:40:31.817 に答える
1

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

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

私のコードの逐語的無償

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

必要なのはそれだけです!

于 2012-04-21T05:10:41.403 に答える
0

通常、回答を出す前にテストしますが、開発用PCから離れて操作しているため、どちらのルートが最適かは100%わかりませんが、試してみるアイデアをいくつか紹介します。

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

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

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

また、Kyleが提案したように、基になるDataSourceからのイベントを使用してみることができます。

DataTable.RowChangedまたはDataView.ListChangedイベントは、私が開始する場所になります。

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

于 2009-08-11T02:56:08.043 に答える