セルが結合されている場合、コピー&ペースト操作が不正になる

文書番号 : 41412     文書種別 : 既知の問題     登録日 : 2017/11/16     最終更新日 : 2018/07/06
文書を印刷する
対象製品
SPREAD for WPF 2.0J
ステータス
修正済み
詳細
セルが結合されている場合(自動マージが設定されている場合を含む)、当該セル全体またはセル内の一部の文字列を選択してコピーし、他のセルやテキストエディタに貼り付けた際、以下の問題が発生します。
  • セル内の一部の文字列を選択してコピーした場合、すべての文字列が貼り付けられる
  • ペーストした際、文字列の後ろに余計な空白文字が追加される
回避方法
Service Pack 1(v2.0.2018.0706)で修正済みです。
Service Pack 1(v2.0.2018.0706)より前のバージョンでは次の回避方法が有効です。
------------------------------------------

以下のように、コピー処理を変更します。

◎サンプルコード(VB.NET)
Public Sub New()
  InitializeComponent()
  CommandManager.AddPreviewCanExecuteHandler(Me.GcSpreadGrid1, AddressOf OnCanExecuteCopy)
End Sub

Friend Shared Sub OnExecutedCopy(sender As Object, e As ExecutedRoutedEventArgs)
  Dim spread As GcSpreadGrid = TryCast(sender, GcSpreadGrid)
  If spread IsNot Nothing Then
    spread.EditCommands.Copy.Execute(e.Parameter)
  End If
End Sub

Friend Shared Sub OnCanExecuteCopy(sender As Object, e As CanExecuteRoutedEventArgs)
  If e.Command Is ApplicationCommands.Copy Then
    Dim spread As GcSpreadGrid = TryCast(sender, GcSpreadGrid)
    Dim selectRanges = spread.SelectedRanges
    If selectRanges.Count = 1 Then
      Dim range = selectRanges(0)
      If range.RangeType = CellRangeType.Cells AndAlso (range.RowCount > 1 OrElse range.ColumnCount > 1) Then
        If range.Equals(spread.GetSpanInfo(range.Row, range.Column)) OrElse range.Equals(spread.GetAutoMergedInfo(range.Row, range.Column)) Then
          Dim textBox = TryCast(e.OriginalSource, TextBox)
          If textBox IsNot Nothing AndAlso textBox.SelectionLength > 0 Then
            e.ContinueRouting = False
            e.CanExecute = True
            e.Handled = True
          End If
        End If
      End If
    End If
  End If
End Sub

◎サンプルコード(C#)
public MainWindow()
{
  InitializeComponent();
  CommandManager.AddPreviewCanExecuteHandler(this.GcSpreadGrid1, OnCanExecuteCopy);
}

internal static void OnExecutedCopy(object sender, ExecutedRoutedEventArgs e)
{
  GcSpreadGrid spread = sender as GcSpreadGrid;
  if (spread != null)
  {
    spread.EditCommands.Copy.Execute(e.Parameter);
  }
}
internal static void OnCanExecuteCopy(object sender, CanExecuteRoutedEventArgs e)
{
  if (e.Command == ApplicationCommands.Copy)
  {
    GcSpreadGrid spread = sender as GcSpreadGrid;
    var selectRanges = spread.SelectedRanges;
    if (selectRanges.Count == 1)
    {
      var range = selectRanges[0];
      if (range.RangeType == CellRangeType.Cells && (range.RowCount > 1 || range.ColumnCount > 1))
      {
        if (range.Equals(spread.GetSpanInfo(range.Row, range.Column)) || range.Equals(spread.GetAutoMergedInfo(range.Row, range.Column)))
        {
          var textBox = e.OriginalSource as TextBox;
          if (textBox != null && textBox.SelectionLength > 0)
          {
            e.ContinueRouting = false;
            e.CanExecute = true;
            e.Handled = true;
          }
        }
      }
    }
  }
}