コンボリストセル

ComboListCell は編集可能なコンボボックスセルを作成します。ユーザーは自由に入力したり、オートコンプリートを利用したり、ドロップダウンリストから選択したりできます。DropdownListCell(選択のみ)とは異なり、ComboListCell はユーザーが入力した新しい値も受け入れます。

名前空間

using unvell.ReoGrid.CellTypes;

コンボリストセルの作成

var sheet = grid.CurrentWorksheet;
var combo = new ComboListCell("Apple", "Banana", "Orange", "Applause", "Appreciate");
sheet.Cells["C3"].Body = combo;

コンストラクター

コンストラクター説明
ComboListCell()空のコンボリスト
ComboListCell(params string[] candidates)文字列項目で作成
ComboListCell(List<string> candidates)変更可能なリストで作成(リンクを維持)
ComboListCell(IEnumerable<string> candidates)任意のコレクションで作成
ComboListCell(ReferenceRange refRange)セル範囲をデータソースとして作成

変更可能なリストの使用

List<string> を渡して項目を同期させます。リストに追加された新しい項目はドロップダウンに表示されます。

var items = new List<string> { "Alpha", "Beta", "Gamma" };
var combo = new ComboListCell(items);
sheet["B5"] = combo;

items.Add("Delta"); // immediately available in the dropdown

セル範囲の使用

範囲にバインドして、リストが現在のセル内容を反映するようにします。

var combo = new ComboListCell(sheet.Ranges["A2:A20"]);
sheet["D2"] = combo;

プロパティ

ComboListCellのプロパティ

プロパティデフォルト説明
SelectedItemobject現在選択されている項目
SelectedIndexint選択された項目のインデックス
EnableAutoCompletionbooltrue入力中のオートコンプリートを有効化
AutoCompleteCompareratorFunc<string, string, bool>前方一致カスタム比較関数
CandidationListSearchProviderFunc<object, IList<string>>null大規模/リモートデータセット用のカスタム検索プロバイダー
プロパティデフォルト説明
PullDownOnClickboolfalseセルクリック時にドロップダウンを開く
DropdownButtonSizeRGSize16x16ドロップダウンボタンのサイズ
DropdownButtonAutoHeightbooltrueボタンの高さをセルに合わせて自動調整
IsDropdownboolドロップダウンパネルが現在開いているかどうか
DropdownPanelHeightint200ドロップダウンパネルの高さ
MinimumDropdownWidthint40ドロップダウンパネルの最小幅
MaximumDropdownWidthint1200ドロップダウンパネルの最大幅
DropdownControlControlパネル内のプラットフォームコントロール
DropdownButtonStyleDropdownCellStyleドロップダウンボタンのビジュアルスタイル

イベント

イベント説明
SelectedItemChanged選択された項目が変更されたときに発生
DropdownOpenedドロップダウンパネルが開いたときに発生(継承)
DropdownClosedドロップダウンパネルが閉じたときに発生(継承)
combo.SelectedItemChanged += (s, e) =>
{
    Console.WriteLine($"Selected: {combo.SelectedItem}");
};

メソッド

メソッド説明
PushDown(bool forceCellEdit = true)プログラムでドロップダウンパネルを開く
PullUp()ドロップダウンパネルを閉じる
Clone()このセルボディのコピーを作成

オートコンプリート

オートコンプリートはデフォルトで有効です。ユーザーが入力すると、一致する項目が提案され、残りのテキストが自動入力されます。

オートコンプリートの無効化

combo.EnableAutoCompletion = false;

カスタム比較ロジック

デフォルトの比較は大文字小文字を区別しない前方一致(StartsWith)を使用します。異なる動作にオーバーライドします。

// Substring match instead of prefix match
combo.AutoCompleteComparerator = (item, text) =>
{
    if (string.IsNullOrWhiteSpace(text)) return false;
    return item.Contains(text, StringComparison.OrdinalIgnoreCase);
};

関数のシグネチャは Func<string, string, bool> で:

  • 第1パラメーター: 候補項目のテキスト
  • 第2パラメーター: ユーザーが入力したテキスト
  • 項目を候補に含める場合は true を返す

カスタム検索プロバイダー

大規模またはリモートデータセットの場合、フィルタリングされた候補を動的に返す検索プロバイダーを提供します。

combo.CandidationListSearchProvider = text =>
{
    return ProductSearch(text?.ToString())
        .Take(20)
        .ToList();
};

関数のシグネチャは Func<object, IList<string>> で:

  • パラメーター: ユーザーが現在入力したテキスト
  • 戻り値: 表示するフィルタリングされた候補リスト

検索プロバイダーが設定されると、デフォルトのフィルタリング動作が完全に置き換えられます。

新しい値のキャプチャ

ComboListCell はフリーテキスト入力を許可するため、ユーザーは元のリストにない値を入力できます。これらをキャプチャして今後の候補に追加します。

var items = new List<string> { "Alpha", "Beta" };
var combo = new ComboListCell(items);
sheet["B5"] = combo;

sheet.AfterCellEdit += (s, e) =>
{
    if (ReferenceEquals(e.Cell.Body, combo) &&
        e.NewData is string text &&
        !string.IsNullOrWhiteSpace(text) &&
        !items.Contains(text))
    {
        items.Add(text);
    }
};

キーボード動作

キーアクション
上 / 下候補リスト内をナビゲート
Enter / Spaceハイライトされた項目を確定
Tab確定して次のセルに移動
Escape選択せずにドロップダウンを閉じる

WPFスタイリング

WPFでは、Style プロパティを通じてリストの外観をカスタマイズします。

#if WPF
combo.Style.TextColor = SolidColor.DarkBlue;
combo.Style.BackColor = SolidColor.LightYellow;
combo.Style.FontSize = 14;
combo.Style.FontWeight = FontWeights.Bold;
#endif

ComboListStyleのプロパティ(WPFのみ)

プロパティ説明
TextColorSolidColorリスト内のテキスト色
BackColorSolidColor背景色
FontFontFamilyフォントファミリー
FontWeightFontWeightフォントウェイト
FontSizedoubleフォントサイズ
FontStyleFontStyleフォントスタイル
HorizontalAlignmentHorizontalAlignment項目の水平配置
VerticalAlignmentVerticalAlignment項目の垂直配置
PaddingPaddingValue項目のパディング
Reset()メソッドデフォルトスタイルにリセット

ListBoxテンプレートのオーバーライド(WPF)

ドロップダウンの ListBox にカスタムの ControlTemplate/ItemTemplate を適用します。

<Window.Resources>
    <ControlTemplate x:Key="ReoGridComboListTemplate" TargetType="ListBox">
        <Border Background="#101820" CornerRadius="6" Padding="4">
            <ScrollViewer Focusable="False">
                <ItemsPresenter />
            </ScrollViewer>
        </Border>
    </ControlTemplate>

    <DataTemplate x:Key="ReoGridComboItemTemplate">
        <StackPanel Orientation="Horizontal" Margin="4,2">
            <Ellipse Width="6" Height="6" Fill="#FF7A00" Margin="0,0,6,0"/>
            <TextBlock Text="{Binding}" Foreground="White"/>
        </StackPanel>
    </DataTemplate>
</Window.Resources>

コードで接続します。

#if WPF
combo.DropdownOpened += (s, e) =>
{
    if (((ComboListCell)s).DropdownControl is ListBox listBox)
    {
        listBox.Template = (ControlTemplate)FindResource("ReoGridComboListTemplate");
        listBox.ItemTemplate = (DataTemplate)FindResource("ReoGridComboItemTemplate");
    }
};
#endif

ComboListCellの拡張

より深いカスタマイズのために ComboListCell をサブクラス化します。

class ProductComboCell : ComboListCell
{
    private readonly ProductService _service;

    public ProductComboCell(ProductService service) : base()
    {
        _service = service;
        CandidationListSearchProvider = text =>
            _service.Search(text?.ToString()).Select(p => p.Name).ToList();
    }
}

比較: DropdownListCell vs ComboListCell

機能DropdownListCellComboListCell
リストから選択はいはい
フリーテキスト入力いいえはい
オートコンプリートいいえはい(設定可能)
カスタム検索プロバイダーいいえはい
新しい値を受け入れいいえはい

クラス階層

CellBody
  └─ DropdownCell (panel, button, open/close)
       └─ DropdownListBaseCell (candidate source)
            ├─ DropdownListCell (selection-only)
            └─ ComboListCell (editable + auto-complete)

関連トピック


ページの内容は役に立ちましたか?