DataAllowAddNewをTrueにした場合に目的とは異なる行が挿入、削除されることがある
対象製品
SPREAD for Windows Forms 7.0J
発生環境
Version 7.0.2010.2008(SP2)で発生し、Version 7.0.2003.2008(SP1)では発生しません。
状況
修正済み
詳細
DataAllowAddNewをTrueにした場合に目的とは異なる行が挿入、削除されることがあります。
【手順】
1.新規フォームにSPREADを配置します
2.下記サンプルコードをコピーし、アプリケーションを実行します
3.新規行のA1セルに"a"を入力します
4.新規行のA2セルに"b"を入力します
5.新規行のA3セルに"c"を入力します
6.新規行のA4セルに"d"を入力します
7.A1セルをクリックします
8.F5キーを押下します
9.F6キーを押下します
10.A3セルをクリックします
11.F7キーを押下します
--2行目に新しい行が挿入されます
※本来は、3行目に新しい行が挿入されます
【サンプルコード】
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' データの作成
Dim dt As New DataTable("TEST")
dt.Columns.Add("ColumnA", GetType(String))
dt.Columns.Add("ColumnB", GetType(String))
dt.AcceptChanges()
' SPREADの設定
FpSpread1.ActiveSheet.DataAutoSizeColumns = False
FpSpread1.ActiveSheet.DataSource = dt
FpSpread1.ActiveSheet.DataAllowAddNew = True
' Formの設定
Me.KeyPreview = True
End Sub
Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
Select Case e.KeyCode
Case Keys.F5
e.SuppressKeyPress = True
Dim dt As DataTable = FpSpread1.ActiveSheet.DataSource
dt.AcceptChanges()
Case Keys.F6
e.SuppressKeyPress = True
FpSpread1.ActiveSheet.RemoveRows(FpSpread1.ActiveSheet.ActiveRowIndex, 1)
Case Keys.F7
e.SuppressKeyPress = True
FpSpread1.ActiveSheet.AddRows(FpSpread1.ActiveSheet.ActiveRowIndex, 1)
End Select
End Sub
【手順】
1.新規フォームにSPREADを配置します
2.下記サンプルコードをコピーし、アプリケーションを実行します
3.新規行のA1セルに"a"を入力します
4.新規行のA2セルに"b"を入力します
5.新規行のA3セルに"c"を入力します
6.新規行のA4セルに"d"を入力します
7.A1セルをクリックします
8.F5キーを押下します
9.F6キーを押下します
10.A3セルをクリックします
11.F7キーを押下します
--2行目に新しい行が挿入されます
※本来は、3行目に新しい行が挿入されます
【サンプルコード】
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' データの作成
Dim dt As New DataTable("TEST")
dt.Columns.Add("ColumnA", GetType(String))
dt.Columns.Add("ColumnB", GetType(String))
dt.AcceptChanges()
' SPREADの設定
FpSpread1.ActiveSheet.DataAutoSizeColumns = False
FpSpread1.ActiveSheet.DataSource = dt
FpSpread1.ActiveSheet.DataAllowAddNew = True
' Formの設定
Me.KeyPreview = True
End Sub
Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
Select Case e.KeyCode
Case Keys.F5
e.SuppressKeyPress = True
Dim dt As DataTable = FpSpread1.ActiveSheet.DataSource
dt.AcceptChanges()
Case Keys.F6
e.SuppressKeyPress = True
FpSpread1.ActiveSheet.RemoveRows(FpSpread1.ActiveSheet.ActiveRowIndex, 1)
Case Keys.F7
e.SuppressKeyPress = True
FpSpread1.ActiveSheet.AddRows(FpSpread1.ActiveSheet.ActiveRowIndex, 1)
End Select
End Sub
回避方法
Service Pack 3(v7.0.2014.2008)で修正済み。
Service Pack 3(v7.0.2014.2008)より前のバージョンでは次の回避方法が有効です。
------------------------------------------
行の挿入や削除を行う都度、データソースのAcceptChangesメソッドを呼び出します。
【サンプルコード】
Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
Select Case e.KeyCode
Case Keys.F5
e.SuppressKeyPress = True
Dim dt As DataTable = FpSpread1.ActiveSheet.DataSource
dt.AcceptChanges()
Case Keys.F6
e.SuppressKeyPress = True
FpSpread1.ActiveSheet.RemoveRows(FpSpread1.ActiveSheet.ActiveRowIndex, 1)
Dim dt As DataTable = FpSpread1.ActiveSheet.DataSource
dt.AcceptChanges() ' 回避策
Case Keys.F7
e.SuppressKeyPress = True
FpSpread1.ActiveSheet.AddRows(FpSpread1.ActiveSheet.ActiveRowIndex, 1)
Dim dt As DataTable = FpSpread1.ActiveSheet.DataSource
dt.AcceptChanges() ' 回避策
End Select
End Sub
Service Pack 3(v7.0.2014.2008)より前のバージョンでは次の回避方法が有効です。
------------------------------------------
行の挿入や削除を行う都度、データソースのAcceptChangesメソッドを呼び出します。
【サンプルコード】
Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
Select Case e.KeyCode
Case Keys.F5
e.SuppressKeyPress = True
Dim dt As DataTable = FpSpread1.ActiveSheet.DataSource
dt.AcceptChanges()
Case Keys.F6
e.SuppressKeyPress = True
FpSpread1.ActiveSheet.RemoveRows(FpSpread1.ActiveSheet.ActiveRowIndex, 1)
Dim dt As DataTable = FpSpread1.ActiveSheet.DataSource
dt.AcceptChanges() ' 回避策
Case Keys.F7
e.SuppressKeyPress = True
FpSpread1.ActiveSheet.AddRows(FpSpread1.ActiveSheet.ActiveRowIndex, 1)
Dim dt As DataTable = FpSpread1.ActiveSheet.DataSource
dt.AcceptChanges() ' 回避策
End Select
End Sub