DataAllowAddNewをTrueにした場合に目的とは異なる行が挿入、削除されることがある

文書番号 : 37432     文書種別 : 不具合     登録日 : 2014/07/30     最終更新日 : 2014/08/12
文書を印刷する
対象製品
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
回避方法
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