セルが結合されている場合、コピー&ペースト操作が不正になる
対象製品
SPREAD for WPF 1.0J
状況
修正済み
詳細
セルが結合されている場合(自動マージが設定されている場合を含む)、当該セル全体またはセル内の一部の文字列を選択してコピーし、他のセルやテキストエディタに貼り付けた際、以下の問題が発生します。
- セル内の一部の文字列を選択してコピーした場合、すべての文字列が貼り付けられる
- ペーストした際、文字列の後ろに余計な空白文字が追加される
回避方法
Service Pack 4(v1.0.2018.0725)で修正済みです。
Service Pack 4(v1.0.2018.0725)より前のバージョンでは次の回避方法が有効です。
------------------------------------------
以下のように、コピー処理を変更します。
◎サンプルコード(VB.NET)
◎サンプルコード(C#)
Service Pack 4(v1.0.2018.0725)より前のバージョンでは次の回避方法が有効です。
------------------------------------------
以下のように、コピー処理を変更します。
◎サンプルコード(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;
}
}
}
}
}
}