作成日: 2026/07/13 最終更新日: 2026/07/16
文書種別
不具合
状況
回避方法あり
詳細
.NET 10をターゲットフレームワークとするプロジェクトを作成しGcSpreadGridを配置します。アプリケーションの起動後にGcSpreadGridのセルを選択して以下のキーボード操作でコピー/切り取りを行います。
・Ctrl + C
・Ctrl + X
・Ctrl + Insert
その結果、次のような例外が発生します。
System.StackOverflowException
HResult=0x800703E9
Message=Exception of type 'System.StackOverflowException' was thrown.
本現象はターゲットフレームワークが.NET 8のプロジェクトでは発生しません。
回避方法
デフォルトのコピー/切り取りの操作をキャンセルして独自にセルの値をクリップボードにコピーする方法を使用して回避が可能です。
public MainWindow()
{
InitializeComponent();
CommandManager.AddPreviewExecutedHandler(this.gcSpreadGrid1, OnPreviewExecuted);
}
private void OnPreviewExecuted(object sender, ExecutedRoutedEventArgs e)
{
if (e.Command != ApplicationCommands.Copy && e.Command != ApplicationCommands.Cut)
{
return;
}
if (sender is not GcSpreadGrid spreadGrid)
{
return;
}
if (spreadGrid.ActiveCell != null && spreadGrid.ActiveCell.IsEditing)
{
return;
}
var range = GetSelectedRange(spreadGrid);
if (range.RowCount > 0 && range.ColumnCount > 0)
{
var clipData = spreadGrid.GetClipDataObject(range.Row, range.Column, range.RowCount, range.ColumnCount, spreadGrid.ClipboardCopyOptions);
if (clipData != null)
{
Clipboard.SetDataObject(clipData, true);
if (e.Command == ApplicationCommands.Cut)
{
spreadGrid.ClearRange(range.Row, range.Column, range.RowCount, range.ColumnCount, spreadGrid.ClipboardCopyOptions);
}
}
}
e.Handled = true;
}
private CellRange GetSelectedRange(GcSpreadGrid spreadGrid)
{
if (spreadGrid.Rows.Count <= 0 || spreadGrid.Columns.Count <= 0 || spreadGrid.SelectedRanges.Count != 1)
{
return new CellRange(0, 0, 0, 0);
}
var selectedRange = spreadGrid.SelectedRanges[0];
var row = selectedRange.Row;
var column = selectedRange.Column;
var rowCount = selectedRange.RowCount;
var columnCount = selectedRange.ColumnCount;
if (row < 0)
{
row = 0;
rowCount = spreadGrid.Rows.Count;
}
if (column < 0)
{
column = 0;
columnCount = spreadGrid.Columns.Count;
}
if (rowCount <= 0)
{
rowCount = spreadGrid.Rows.Count - row;
}
if (columnCount <= 0)
{
columnCount = spreadGrid.Columns.Count - column;
}
row = Math.Max(0, Math.Min(row, spreadGrid.Rows.Count - 1));
column = Math.Max(0, Math.Min(column, spreadGrid.Columns.Count - 1));
rowCount = Math.Max(1, Math.Min(rowCount, spreadGrid.Rows.Count - row));
columnCount = Math.Max(1, Math.Min(columnCount, spreadGrid.Columns.Count - column));
return new CellRange(row, column, rowCount, columnCount);
}