対象: Spread 19 for Windows Forms (Mescius社)
所要時間: 約2分
ごあいさつ
こんにちは、「様子見駆動開発技師フジワラ」です
SPREAD(メシウス社)を使ったVB6からC#のマイグレーション作業で気になった点を書きためてます…今回は一覧選択UIのスタイル設定まわりです。
SPREADで「一覧から行を選択する」UIを作りたい
業務アプリ等でよくある、「一覧を表示してクリックで行を選択する」というやつです。
いざ実装しようとすると細かいところで詰まります。
- 選択行に色がつかない
- アクティブセルだけ色が変わらない
- ヘッダまで選択状態になってしまう
- フォーカス枠を表示したくない
一個一個は些細なことですが、全部つぶすのに地味に手間がかかります。
ActiveX 版 SPREAD 7.0 では…
ActiveX 版では選択スタイルもデザイナのプロパティで直感的に設定できていました。シンプルでした。
WinForms 版では同じ感覚では探しにくく、複数のプロパティを組み合わせる必要があります。
マイグレーション案件でここを再現しようとして時間を溶かしてしまったので自身の備忘としても書き留めておきます。
解決策:個々のプロパティを設定
選択行に色がつかない
SelectionStyle = SelectionColors と SelectionBackColor はセットで設定
SelectionStyle = SelectionStyles.SelectionColors を設定しないと、SelectionBackColor を指定しても色が反映されません。この2つはセットで設定するのが必須です。
アクティブセルだけ色が変わらない
PaintActiveCellInSelection = true
行全体に選択色を付けたつもりが、アクティブセルだけ別の色のまま残る問題を解消します。
これを true にすることで、アクティブセルにも SelectionBackColor が適用されます。
ヘッダまで選択状態になってしまう
PaintSelectionHeader = false
行を選択したときにヘッダ行まで選択色になるのを防ぎます。
これを設定しないと、ヘッダが選択ハイライトされて見た目がちょっとおかしくなります。
フォーカス枠を表示したくない
FocusRenderer = new DefaultFocusIndicatorRenderer(0)
セルにフォーカスが当たったときに表示される点線枠(フォーカスインジケーター)を非表示にします。
引数の 0 はインジケーターの幅です。0 を渡すことで実質的に見えなくなります。
【追記】こちらも参照してみてください
ユーティリティメソッドとして1か所にまとめる
以下のメソッドを用意しておくと、FpSpread に対して一括で一覧選択スタイルを適用できます。
/// <summary>
/// FpSpread を一覧選択UIとして動作させるためのスタイル設定を行う。
/// </summary>
/// <param name="spread">対象の FpSpread コントロール</param>
/// <param name="color">選択行の背景色(ARGB値)。省略時は薄い緑</param>
public static void SetSelectionListStyle(FpSpread spread, int color = -1)
{
var sheet = spread.Sheets[0];
// 行モード:クリックで行全体を選択
sheet.OperationMode = OperationMode.RowMode;
// SelectionBackColor を有効にするために必要
sheet.SelectionStyle = SelectionStyles.SelectionColors;
// 選択行の背景色(引数省略時は薄いグリーン)
sheet.SelectionBackColor = color == -1
? Color.FromArgb(128, 255, 128)
: Color.FromArgb(color);
// アクティブセルにも選択色を適用する
spread.PaintActiveCellInSelection = true;
// ヘッダを選択状態にしない
spread.PaintSelectionHeader = false;
// フォーカスインジケーターを非表示にする
spread.FocusRenderer = new DefaultFocusIndicatorRenderer(0);
}
使い方
フォームの初期化処理(InitializeComponent() の後)で呼び出すだけです。
private void Form1_Load(object sender, EventArgs e)
{
// デフォルト色(薄いグリーン)を使う場合
SpreadHelper.SetSelectionListStyle(fpSpread1);
// 色をカスタマイズする場合(例:薄い青)
SpreadHelper.SetSelectionListStyle(fpSpread1,
Color.FromArgb(180, 210, 255).ToArgb());
}
ポイントまとめ
-
SelectionStyle = SelectionColorsとSelectionBackColorはセット必須 -
PaintActiveCellInSelection = trueでアクティブセルにも選択色を統一 -
PaintSelectionHeader = falseでヘッダの選択ハイライトをオフ -
FocusRenderer = new DefaultFocusIndicatorRenderer(0)でフォーカス枠を非表示
おわりに
Spread全体・各シート・各セル、とそれぞれ設定があり、どのレベルで設定するのか、コードでしか設定できないのかとか、まだちょっと慣れずで想定外のところで時間かかったりしてます。
この記事にたどりついたみなさんの作業効率が少しでもあがることを願います。

