作成日: 2020/04/02 最終更新日: 2020/04/30
文書種別
不具合
状況
修正済み
詳細
データソースと連結を行いDefaultSheetDataModelクラスのChangedイベントをハンドリングすると、セルの値を変更して編集を終了したタイミングでChangedイベントが2回発生し、行を移動したタイミングで2回発生します(それぞれ1回ずつ発生するのが本来の動作です)。また、SetValueメソッドで同じ値セットした場合にもChangedイベントが1回発生します(本来は発生しません)。
【再現手順】
1.新規作成したプロジェクトのForm1にFpSpreadとButtonを貼り付ける。
2.下記サンプルコードを記述し、プロジェクトをデバック実行する。
3.ColAまたはColB列で値を変更し、Tabキーで次のセルに移る
--チェンジイベントが2回発生する(コンソール出力)
4.アクティブセルを別の行に移動する
--チェンジイベントが2回発生する(コンソール出力)
5.画面のボタンを押下してSetValueメソッドで同じ値をセットする
----チェンジイベントが発生する
■サンプルコード(VB.NET)
【再現手順】
1.新規作成したプロジェクトのForm1にFpSpreadとButtonを貼り付ける。
2.下記サンプルコードを記述し、プロジェクトをデバック実行する。
3.ColAまたはColB列で値を変更し、Tabキーで次のセルに移る
--チェンジイベントが2回発生する(コンソール出力)
4.アクティブセルを別の行に移動する
--チェンジイベントが2回発生する(コンソール出力)
5.画面のボタンを押下してSetValueメソッドで同じ値をセットする
----チェンジイベントが発生する
■サンプルコード(VB.NET)
Imports FarPoint.Win.Spread.Model
Public Class Form1
Private WithEvents dm As FarPoint.Win.Spread.Model.DefaultSheetDataModel
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' バージョンの確認
Me.Text = FpSpread1.ProductVersion
' データの作成
Dim dt As New DataTable("Test")
dt.Columns.Add("ColA", GetType(String))
dt.Columns.Add("ColB", GetType(String))
dt.Rows.Add("A", "C")
dt.Rows.Add("B", "D")
' コンボボックス型セルの設定
Dim comboCell As New FarPoint.Win.Spread.CellType.ComboBoxCellType()
comboCell.Items = New String() {"", "A", "B"}
FpSpread1.ActiveSheet.Columns(0).CellType = comboCell
' 値の設定
FpSpread1.ActiveSheet.Columns(0).DataField = "ColA"
FpSpread1.ActiveSheet.Columns(1).DataField = "ColB"
FpSpread1.ActiveSheet.AutoGenerateColumns = False
FpSpread1.ActiveSheet.DataAutoCellTypes = False
FpSpread1.ActiveSheet.DataAutoSizeColumns = False
FpSpread1.ActiveSheet.DataSource = dt
' データモデルの設定
dm = FpSpread1.ActiveSheet.Models.Data
End Sub
Private Sub dm_Changed(sender As Object, e As SheetDataModelEventArgs) Handles dm.Changed
Debug.WriteLine("Type: {0}, Row: {1}, Column: {2}", e.Type, e.Row, e.Column)
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Debug.WriteLine("***** SetValue *****")
'dm.SetValue(0, 0, dm.GetValue(0, 0).ToString)
dm.SetValue(0, 1, dm.GetValue(0, 1).ToString)
End Sub
Private Sub FpSpread1_LeaveCell(sender As Object, e As FarPoint.Win.Spread.LeaveCellEventArgs) Handles FpSpread1.LeaveCell
Debug.WriteLine("***** LeaveCell {0}, {1} *****", e.Row, e.Column)
End Sub
End Class
Public Class Form1
Private WithEvents dm As FarPoint.Win.Spread.Model.DefaultSheetDataModel
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' バージョンの確認
Me.Text = FpSpread1.ProductVersion
' データの作成
Dim dt As New DataTable("Test")
dt.Columns.Add("ColA", GetType(String))
dt.Columns.Add("ColB", GetType(String))
dt.Rows.Add("A", "C")
dt.Rows.Add("B", "D")
' コンボボックス型セルの設定
Dim comboCell As New FarPoint.Win.Spread.CellType.ComboBoxCellType()
comboCell.Items = New String() {"", "A", "B"}
FpSpread1.ActiveSheet.Columns(0).CellType = comboCell
' 値の設定
FpSpread1.ActiveSheet.Columns(0).DataField = "ColA"
FpSpread1.ActiveSheet.Columns(1).DataField = "ColB"
FpSpread1.ActiveSheet.AutoGenerateColumns = False
FpSpread1.ActiveSheet.DataAutoCellTypes = False
FpSpread1.ActiveSheet.DataAutoSizeColumns = False
FpSpread1.ActiveSheet.DataSource = dt
' データモデルの設定
dm = FpSpread1.ActiveSheet.Models.Data
End Sub
Private Sub dm_Changed(sender As Object, e As SheetDataModelEventArgs) Handles dm.Changed
Debug.WriteLine("Type: {0}, Row: {1}, Column: {2}", e.Type, e.Row, e.Column)
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Debug.WriteLine("***** SetValue *****")
'dm.SetValue(0, 0, dm.GetValue(0, 0).ToString)
dm.SetValue(0, 1, dm.GetValue(0, 1).ToString)
End Sub
Private Sub FpSpread1_LeaveCell(sender As Object, e As FarPoint.Win.Spread.LeaveCellEventArgs) Handles FpSpread1.LeaveCell
Debug.WriteLine("***** LeaveCell {0}, {1} *****", e.Row, e.Column)
End Sub
End Class
回避方法
Service Pack 4(v12.0.4505.2012)で修正済み。
旧文書番号
85134