- PR -

変更された行内で計算

1
投稿者投稿内容
Tog
ベテラン
会議室デビュー日: 2002/06/09
投稿数: 76
投稿日時: 2002-11-09 08:41
こんにちわ。色々と試してみているのですがどうも上手く出来ずに質問させていただきました。よろしくお願いいたします。

やりたいことは変更された行内で計算を行うことです。
DataColumnのExpressioプロパティに式を入力できればいちばん簡単なのですが、ADO.Netで使用可能な演算子だけで計算を行うことができません。そのため、コードで計算して行の更新時に計算された値を保存したいと思っているのですが、RowChangedイベントから

with e.row
.item("A") = calc.calclation(.item("B"), .item("C"))
.item("D") = calc.calclation(.item("C"), .item("E"))
end with
(calcは計算用に作成したクラスのインスタンスです。)

と書いてみたのですが、上記2行目を実行した時点で再度RowChangedイベントが発生してしまい無限ループに入ってしまいます。

処理の前にe.row.BeginEditを実行しておけばいいのではないかと試してみたのですが、なぜか上記2行目が実行された時点でRowChanged呼び出しのメソッドに戻ってしまたりと・・・うまくできないで困っています。
ぜひアドバイスお願いいたします。
べーちゃん
大ベテラン
会議室デビュー日: 2002/07/21
投稿数: 121
投稿日時: 2002-11-09 11:44
根本的な解決法ではありませんがRowChangedイベントを以下のようにすると
とりあえず無限ループは回避できないでしょうか。

with e.row
If .item("A") <> calc.calclation(.item("B"), .item("C")) Then
.item("A") = calc.calclation(.item("B"), .item("C"))
End If
If .item("D") <> calc.calclation(.item("C"), .item("E")) Then
.item("D") = calc.calclation(.item("C"), .item("E"))
End If
end with
Tog
ベテラン
会議室デビュー日: 2002/06/09
投稿数: 76
投稿日時: 2002-11-10 07:41
べーちゃんさん。お返事ありがとうございます。
なるほど!この方法は気がつきませんでした。

早速試してみました。

If .item("A") <> calc.calclation(.item("B"), .item("C"))

でキャストが発生した時点でRowChangedが呼び出されてしまうようです。
そのため下のように一度変数にキャストした値を代入しその値をチェックするようにしてみたところ無事に動作したのですが・・なにかすごく無駄な処理ですね(^^;;

Try
a = DirectCast(.Item("A"), Double)
b = DirectCast(calc.calclation(.Item("B"),.item("C")), Double)
If a <> b Then
.Item("A") = calc.calclation(.Item("B"),.item("C"))
End If
Catch ex As Exception
.Item("A") = calc.calclation(.Item("B"),.item("C"))
End Try

もっとよい方法があればよろしくおねがいいたします。
1

スキルアップ/キャリアアップ(JOB@IT)