作成日: 2018/10/23 最終更新日: 2018/12/18
文書種別
不具合
状況
修正済み
詳細
■事象
SPREADのサイズを変更(拡大)した時に、右端の列がSPREAD上に表示される場合、LeftChangeイベント内で描画を一時停止してSetViewportLeftColumnメソッドを実行後に描画を再開すると、LeftChangeイベントが再帰的に呼び出されてStackOverflowExceptionが発生します。
■再現サンプルコード(C#)
■再現手順
1. フォーム上にSPREADコントロールを配置します。(※Dockプロパティは"False"に設定します。)
2. 上記コードを実装し、実行します。
3. フォームを最大化します。
-- 例外が発生します。
■備考
LeftChangeイベント内でSetViewportLeftColumnメソッドを実行する前後で描画の停止(SuspendLayout)と描画の再開(ResumeLayout)を行わなければ、この問題は発生しません。
また、SPREAD上の一番右の列が、フォームを最大化した時のSPREAD上に表示可能な状態(スクロールバーによる移動が不要な状態)であれば、この問題は発生しません。
SPREADのサイズを変更(拡大)した時に、右端の列がSPREAD上に表示される場合、LeftChangeイベント内で描画を一時停止してSetViewportLeftColumnメソッドを実行後に描画を再開すると、LeftChangeイベントが再帰的に呼び出されてStackOverflowExceptionが発生します。
■再現サンプルコード(C#)
private void Form1_Load(object sender, EventArgs e)
{
// イベントハンドラの設定
fpSpread1.LeftChange += FpSpread1_LeftChange;
// 列数を設定します。
fpSpread1.ActiveSheet.ColumnCount = 110;
// ビューポートの左端に100番目の列を表示します。
fpSpread1.SetViewportLeftColumn(0, 99);
}
private void FpSpread1_LeftChange(object sender, FarPoint.Win.Spread.LeftChangeEventArgs e)
{
// 100列目より左に移動できないようにします。
if (e.NewLeft < 99)
{
fpSpread1.SuspendLayout();
fpSpread1.SetViewportLeftColumn(e.ColumnViewportIndex, 99);
fpSpread1.ResumeLayout();
}
}
{
// イベントハンドラの設定
fpSpread1.LeftChange += FpSpread1_LeftChange;
// 列数を設定します。
fpSpread1.ActiveSheet.ColumnCount = 110;
// ビューポートの左端に100番目の列を表示します。
fpSpread1.SetViewportLeftColumn(0, 99);
}
private void FpSpread1_LeftChange(object sender, FarPoint.Win.Spread.LeftChangeEventArgs e)
{
// 100列目より左に移動できないようにします。
if (e.NewLeft < 99)
{
fpSpread1.SuspendLayout();
fpSpread1.SetViewportLeftColumn(e.ColumnViewportIndex, 99);
fpSpread1.ResumeLayout();
}
}
■再現手順
1. フォーム上にSPREADコントロールを配置します。(※Dockプロパティは"False"に設定します。)
2. 上記コードを実装し、実行します。
3. フォームを最大化します。
-- 例外が発生します。
■備考
LeftChangeイベント内でSetViewportLeftColumnメソッドを実行する前後で描画の停止(SuspendLayout)と描画の再開(ResumeLayout)を行わなければ、この問題は発生しません。
また、SPREAD上の一番右の列が、フォームを最大化した時のSPREAD上に表示可能な状態(スクロールバーによる移動が不要な状態)であれば、この問題は発生しません。
回避方法
Service Pack 2(v11.0.4503.2012)で修正済み。
Service Pack 2を適用せずに対処する方法としては、ScrollBarMaxAlignプロパティを"false"に設定する方法が有効です。(デフォルトは"True")
このプロパティを"false"に設定するとスクロールバーが最後の列(行)と揃わなくなるため、ScrollBarShowMaxプロパティが"true"に設定されていても、最後の列がSPREADの右端に来るような描画動作でなくなり、今回の問題が発生しなくなります。
Service Pack 2を適用せずに対処する方法としては、ScrollBarMaxAlignプロパティを"false"に設定する方法が有効です。(デフォルトは"True")
このプロパティを"false"に設定するとスクロールバーが最後の列(行)と揃わなくなるため、ScrollBarShowMaxプロパティが"true"に設定されていても、最後の列がSPREADの右端に来るような描画動作でなくなり、今回の問題が発生しなくなります。
旧文書番号
83317