自動マージされたセルが含まれる行や列を削除すると、例外が発生する場合がある

文書番号 : 39430     文書種別 : 不具合     登録日 : 2016/06/08     最終更新日 : 2016/12/07
文書を印刷する
対象製品
SPREAD for WPF 1.0J
状況
修正済み
詳細
アクティブセル(アクティブ行)に自動マージが含まれ、またアクティブ行の追加後、行の移動が行われない状態で行を削除しようとすると、例外が発生します。
また、列の追加と削除においても同様の現象が発生します。

【手順】
1.新規ウィンドウにSPREAD1つとButton2つ(AddButtonとRemoveButton)を配置します
2.下記サンプルコードをコピーし、アプリケーションを実行します
3.最終行を選択します。
4.AddButtonをクリックします
5.RemoveButtonをクリックします
   --例外が発生します

◎サンプルコード(VB)
Public Sub New()

  ' この呼び出しはデザイナーで必要です。
  InitializeComponent()
  GcSpreadGrid1.Columns(0).MergePolicy = MergePolicy.Always
  GcSpreadGrid1.RowCount = 5
  For i As Integer = 0 To 5
    gcSpreadGrid1(i, 0).Value = (i + 1).ToString()
  Next
End Sub

Private Sub AddButton_Click(sender As Object, e As RoutedEventArgs) Handles AddButton.Click
  Dim newRow As Integer = GcSpreadGrid1.Rows.AddUnboundRow()
  GcSpreadGrid1(newRow, 0).Value = GcSpreadGrid1(newRow - 1, 0).Value
End Sub

Private Sub RemoveButton_Click(sender As Object, e As RoutedEventArgs) Handles RemoveButton.Click
  GcSpreadGrid1.Rows.Remove(GcSpreadGrid1.ActiveRowIndex)
End Sub

◎サンプルコード(C#)
public MainWindow()
{
  InitializeComponent();
  gcSpreadGrid1.Columns[0].MergePolicy = MergePolicy.Always;
  gcSpreadGrid1.RowCount = 5;
  for (int i = 0; i < 5; i++)
  {
    gcSpreadGrid1[i, 0].Value = (i + 1).ToString();
  }
}

private void AddButton_Click(object sender, RoutedEventArgs e)
{
  int newRow = gcSpreadGrid1.Rows.AddUnboundRow();
  gcSpreadGrid1[newRow, 0].Value = gcSpreadGrid1[newRow - 1, 0].Value;
}

private void RemoveButton_Click(object sender, RoutedEventArgs e)
{
  gcSpreadGrid1.Rows.Remove(gcSpreadGrid1.ActiveRowIndex);
}
回避方法
Service Pack 3(v1.0.2016.1207)で修正済みです。
Service Pack 3(v1.0.2016.1207)より前のバージョンでは次の回避方法が有効です。
------------------------------------------

行や列を削除する前にアクティブセルをいったんクリアします。

◎サンプルコード(VB)
Private Sub RemoveButton_Click(sender As Object, e As RoutedEventArgs) Handles RemoveButton.Click
  Dim cp As CellPosition = GcSpreadGrid1.ActiveCellPosition
  GcSpreadGrid1.ActiveCellPosition = CellPosition.Empty
  
  GcSpreadGrid1.Rows.Remove(cp.Row)
  
  gcSpreadGrid1.ActiveCellPosition = cp
End Sub

◎サンプルコード(C#)
private void RemoveButton_Click(object sender, RoutedEventArgs e)
{
  CellPosition cp = gcSpreadGrid1.ActiveCellPosition;
  gcSpreadGrid1.ActiveCellPosition = CellPosition.Empty;
  
  gcSpreadGrid1.Rows.Remove(cp.Row);

  gcSpreadGrid1.ActiveCellPosition = cp;
}