2008年12月11日木曜日

GrapeCityTool MultiRow5.0J ユーザによるセルの変更を判定するには

Ver4.0にはユーザによるセルの変更を判定するModifiedプロパティがありましたが
Ver5.0にはありません。

実現するにはCellValueChanged イベント を監視し、IsCurrentCellDirtyで変更がコミットされた場合にフラグを立てます。
CellValueChangedイベントはユーザによりセルの値が変更された場合に発生します。
Public ClassCustomMultiRowSheet
Inherits GrapeCity.Win.MultiRow.GcMultiRow

Private _IsModified As Boolean

Public ReadOnly Property Modified() As Boolean
Get
Return Me._IsModified
End Get
End Property

Protected Overrides Sub OnCellValueChanged(ByVal e As GrapeCity.Win.MultiRow.CellEventArgs)
If Me.IsCurrentCellDirty Then
Me._IsModified = True
End If
MyBase.OnCellValueChanged(e)
End Sub

End Class



しかし、ユーザー定義セルでOnCellFormattingメソッドで書式設定などを行うとCellValueChangedイベントが発生するため、
上記の方法ではユーザによるセルの値の変更を判定できません。
そのため、OnCellEnterメソッドで変更前の値を記憶しておき、OnCellEndEditで変更後の値と比較すると
ユーザによるセルの変更を判定できます。
Public ClassCustomMultiRowSheet
Inherits GrapeCity.Win.MultiRow.GcMultiRow

Private _OriginalValue As Object
Private _IsModified As Boolean

Public ReadOnly Property Modified() As Boolean
Get
Return Me._IsModified
End Get
End Property

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 OnCellEndEdit(ByVal e As GrapeCity.Win.MultiRow.CellEndEditEventArgs)
'OnCellEnterイベントで記憶した値と比較し、セルの値が変更されていれば
'ユーザがセルの値を変更したかどうかのフラグを立てます。
'すでにフラグがたっている場合は比較を行いません。
If Me._isModified = False Then
Dim currentValue As Object = Me.GetValue(e.RowIndex, e.CellIndex)
If Me._originalValue Is Nothing Xor currentValue Is Nothing Then
Me._isModified = True
ElseIf Me._originalValue IsNot Nothing And currentValue IsNot Nothing Then
If Me._originalValue.ToString <> currentValue.ToString Then
Me._isModified = True
End If
End If
End If

MyBase.OnCellEndEdit(e)

End Sub

End Class

0 件のコメント: