2008年12月11日木曜日

GrapeCityTool MultiRow5.0J セルの値が変更された場合のみCellValidatingイベントを発生させるには

標準ではセルの移動を行っただけでCellValidatingイベントが発生します。
ユーザによりセルの値が変更された場合のみ、CellValidatingイベントを発生させるようにします。

CellValidatingイベント内で変更後の値は e.FormattedValueで取得できます。
問題は変更前の値の取得方法です。
GetValueメソッドで取得すればいいのですが
下記の1では変更後の値が返ります。2では変更前の値が返ります。

1.以下の操作で発生するイベント
Enterキーで編集状態にする
セルに入力
Enterキーで編集状態を終了する
Tabキーでセル移動

CellEnter
CellBeginEdit
CellEditingControlShowing
CellParsing
CellValueChanged ※セルの値が変更された場合のみ発生する。
CellEndEdit
CellLeave
CellValidating
CellValidated

2.以下の操作で発生するイベント
マウスダブルクリックで編集状態にする
セルに入力
マウスクリックでセル移動
CellEnter
CellBeginEdit
CellEditingControlShowing
CellLeave
CellValidating
CellParsing
CellValueChanged ※セルの値が変更された場合のみ発生する。
CellValidated
CellEndEdit



CellValidatingイベント内でGetValueメソッドで取得する値はあてにならないので
CellEnterイベントでインスタンス変数に変更前の値を退避しておき、
CellValidatingで退避した変更前の値と変更後の値を比較し、ユーザによる変更があったかどうかを判定します。

Public Class CustomMultiRowSheet
Inherits GrapeCity.Win.MultiRow.GcMultiRow

Private _OriginalValue As Object

Protected Overrides Sub OnCellEnter(ByVal e As GrapeCity.Win.MultiRow.CellEventArgs)
'変更前の値を記憶します。
Me._OriginalValue = Me.GetValue(e.RowIndex, e.CellIndex)
MyBase.OnCellEnter(e)
End Sub

Protected Overrides Sub OnCellValidating(ByVal e As GrapeCity.Win.MultiRow.CellValidatingEventArgs)
'OnCellEnterイベントで記憶した値と比較します。
Dim isCellModified As Boolean
Dim currentValue As Object = e.FormattedValue
If Me._originalValue Is Nothing Xor currentValue Is Nothing Then
isCellModified = True
ElseIf Me._originalValue IsNot Nothing And currentValue IsNot Nothing Then
If Me._originalValue.ToString <> currentValue.ToString Then
isCellModified = True
End If
End If

If isCellModified Then
MyBase.OnCellValidating(e)
End If
End Sub

End Class

0 件のコメント: