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のプロパティ
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
SelectedItem | object | — | 現在選択されている項目 |
SelectedIndex | int | — | 選択された項目のインデックス |
EnableAutoCompletion | bool | true | 入力中のオートコンプリートを有効化 |
AutoCompleteComparerator | Func<string, string, bool> | 前方一致 | カスタム比較関数 |
CandidationListSearchProvider | Func<object, IList<string>> | null | 大規模/リモートデータセット用のカスタム検索プロバイダー |
DropdownCellから継承
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
PullDownOnClick | bool | false | セルクリック時にドロップダウンを開く |
DropdownButtonSize | RGSize | 16x16 | ドロップダウンボタンのサイズ |
DropdownButtonAutoHeight | bool | true | ボタンの高さをセルに合わせて自動調整 |
IsDropdown | bool | — | ドロップダウンパネルが現在開いているかどうか |
DropdownPanelHeight | int | 200 | ドロップダウンパネルの高さ |
MinimumDropdownWidth | int | 40 | ドロップダウンパネルの最小幅 |
MaximumDropdownWidth | int | 1200 | ドロップダウンパネルの最大幅 |
DropdownControl | Control | — | パネル内のプラットフォームコントロール |
DropdownButtonStyle | DropdownCellStyle | — | ドロップダウンボタンのビジュアルスタイル |
イベント
| イベント | 説明 |
|---|---|
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のみ)
| プロパティ | 型 | 説明 |
|---|---|---|
TextColor | SolidColor | リスト内のテキスト色 |
BackColor | SolidColor | 背景色 |
Font | FontFamily | フォントファミリー |
FontWeight | FontWeight | フォントウェイト |
FontSize | double | フォントサイズ |
FontStyle | FontStyle | フォントスタイル |
HorizontalAlignment | HorizontalAlignment | 項目の水平配置 |
VerticalAlignment | VerticalAlignment | 項目の垂直配置 |
Padding | PaddingValue | 項目のパディング |
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
| 機能 | DropdownListCell | ComboListCell |
|---|---|---|
| リストから選択 | はい | はい |
| フリーテキスト入力 | いいえ | はい |
| オートコンプリート | いいえ | はい(設定可能) |
| カスタム検索プロバイダー | いいえ | はい |
| 新しい値を受け入れ | いいえ | はい |
クラス階層
CellBody
└─ DropdownCell (panel, button, open/close)
└─ DropdownListBaseCell (candidate source)
├─ DropdownListCell (selection-only)
└─ ComboListCell (editable + auto-complete)
関連トピック
- 組み込みセルタイプ — すべてのセルタイプの概要
- ドロップダウンリストセル — 選択のみのドロップダウン
- カスタムセル — カスタムセルボディの作成
- カスタムドロップダウンセルの作成方法 — カスタムドロップダウンチュートリアル