ユーザによりセルの値が変更された場合のみ、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 件のコメント:
コメントを投稿