型 | プロパティ | 内容 | 既定値 |
---|---|---|---|
ObjectCollection | Items | ListBoxの項目 | |
object | DataSource | データソース。IListまたはIListSourceを実装しているobject | null |
string | DisplayMember | 表示に使用する、データソースのプロパティ名 | "" |
string | FormatString | 表示方法を指定する書式指定子。ただしFormattingEnabledがfalseならば適用されない | "" |
bool | FormattingEnabled | trueならば、DisplayMemberに書式設定が適用される | false (デザイナーで追加するとtrue) |
string | ValueMember | SelectedValueで使用する、データソースのプロパティ名 | "" |
object | SelectedValue | ValueMemberで指定した、データ ソースの値を格納しているオブジェクト | |
CurrencyManager | DataManager | コントロールに関連付けられているCurrencyManager | null |
bool | MultiColumn | trueならば、項目を表示するのに行数が不足したときに、複数の列で表示される。さもなくば、そのような状況では垂直スクロールバーが表示される。 | false |
int | ColumnWidth | MultiColumnがtrueのときの列の幅。0ならば、既定の幅が割り当てられる | 0 |
bool | IntegralHeight | trueならば、項目が部分的に表示されないようにコントロールがリサイズされる | true |
int | ItemHeight | DrawModeがOwnerDrawFixedのときの項目の高さ。範囲は0~255 | |
SelectionMode | SelectionMode | 選択方法
|
SelectionMode.One |
object | SelectedItem | 選択されている項目。選択されている項目がなければnull。Itemsに存在しない項目を指定すると、無視される。 | |
int | SelectedIndex | 選択されている項目のインデックス。選択されている項目がなければ-1。範囲外のインデックスを指定すると、ArgumentOutOfRangeExceptionが投げられる。SelectedIndex - ListBox.cs | |
SelectedObjectCollection | SelectedItems | 選択されている項目のコレクション。複数選択のときに使用 | |
SelectedIndexCollection | SelectedIndices | 選択されている項目のインデックスのコレクション。複数選択のときに使用 | |
int | TopIndex | 最初に表示される項目のインデックス。スクロールバーが表示されているとき、これを指定することでスクロールさせて表示できる | |
bool | Sorted | trueならば、項目がアルファベット順に並べ替えられる | fales |
型はListBox.ObjectCollectionであり、個々の要素はobject型です。ListBox.Items プロパティ (System.Windows.Forms) | Microsoft Learn
DataSourceを1つ以上の要素があるコレクションに設定するとSelectedIndexは0となり、最初の項目が選択されます。要素数が0のコレクションまたはnullを設定したときは、選択が解除されます。
ListControl.DataSource プロパティ (System.Windows.Forms) | Microsoft LearnListViewなどとは異なり、フォーカスを失ったときに強調表示を解除するHideSelectionのようなプロパティが用意されていないため、つねに強調表示されたままとなります。これに対処するにはDrawItemで描画します。
listBox.DrawMode = DrawMode.OwnerDrawFixed;
listBox.DrawItem += (object sender, DrawItemEventArgs e) =>
{
if (!listBox.Focused && e.State.HasFlag(DrawItemState.Selected))
{
e.Graphics.FillRectangle(Brushes.Gray, e.Bounds);
}
else
{
e.DrawBackground(); // DrawBackground - DrawItemEvent.cs
}
e.DrawFocusRectangle();
object obj = listBox.Items[e.Index];
TextRenderer.DrawText(e.Graphics, obj.ToString(), e.Font, e.Bounds, e.ForeColor);
};
またはLeaveやEnterイベントで、SelectedIndexを解除や再設定します。
int index = -1; listBox.Leave += delegate { index = listBox.SelectedIndex; listBox.SelectedIndex = -1; }; listBox.Enter += delegate { listBox.SelectedIndex = index; };
描画モードを設定できます。ListBox.DrawMode プロパティ (System.Windows.Forms) | MSDN
列挙子 | 描画方法 | サイズ |
---|---|---|
Normal | OSに委ねる | すべての要素が同じ大きさ。フォントによって自動で決定 |
OwnerDrawFixed | 独自に描画 | すべての要素が同じ大きさ。ItemHeightプロパティで指定 |
OwnerDrawVariable | 独自に描画 | 要素ごとに異なる大きさ。MeasureItemイベントのハンドラで指定する |
DrawModeをOwnerDrawFixedまたはOwnerDrawVariableにすると、描画が必要なときにDrawItemイベントが発生し、そこで独自に描画できるようになります。
ListBoxにはListView.AutoResizeColumn()のように幅を自動変更するメソッドは用意されていないため、独自に実装します。
int maxWidth = 0; foreach (object item in listBox.Items) { int width = TextRenderer.MeasureText(item.ToString(), listBox.Font).Width; if (maxWidth < width) maxWidth = width; } listBox.Width = maxWidth;
メソッド | 機能 |
---|---|
BeginUpdate() | 項目が1つずつ追加されるとき、コントロールが描画されないようにすることでパフォーマンスを維持する |
EndUpdate() | コントロールの描画を再開する |
FindString(String) | 指定の文字列で始まる項目の、最初のインデックスを得られる |
FindStringExact(String) | 指定の文字列と一致する項目の、最初のインデックスを得られる |
SetSelected(Int32, Boolean) | 指定のインデックスにある項目の選択状態を変更できる |
ClearSelected() | すべての項目の選択を解除できる
(インデックス0の項目だけが選択された状態となることがあるため、適切に選択が解除されたかSelectedIndexを確認する) |
IndexFromPoint(Point) | 指定の座標にある項目のインデックスを取得できる |
型 | イベント | 発生タイミング |
---|---|---|
EventHandler | DataSourceChanged | DataSourceプロパティの値が変更されたとき |
listBox.DataSourceChanged += delegate { }; listBox.DataSource = new[] { 1, 2, 3 }; // DataSourceChangedイベントが発生する listBox.DataSource = new[] { 1, 2, 3 }; // 再度、DataSourceChangedイベントが発生する。同値ではあるが、DataSourceのオブジェクトが変更されたため
SelectedIndexまたはSelectedIndicesが変更されたときに発生します。ListBox.SelectedIndexChanged イベント (System.Windows.Forms) | Microsoft Learn
ただし実際には、たとえば選択されている項目がクリックされた場合のように、SelectedIndexが変更されていないときにもこのイベントは発生します。
ListViewのItemActivateイベントのようにキーボードのEnterには応答しないため、その必要があるならばKeyDownイベントで処理します。
FormattingEnabledプロパティがtrueに設定されているとき、表示されている各項目の書式が設定される前に発生します。Remarks - ListControl.FormattingEnabled Property (System.Windows.Forms) | Microsoft Learn
対象の項目をListControlConvertEventArgs.ListItemから取得して、ListControlConvertEventArgs.Valueに設定することで書式を変更できます。
オーナー描画するときにはこのイベントではなく、DrawItemのハンドラ内で書式化して描画します。
DrawModeをNormal以外に設定しているとき、オーナー描画が必要なときに発生します。ListBox.DrawItem イベント (System.Windows.Forms) | Microsoft Learn
private void ListBox_DrawItem(object sender, DrawItemEventArgs e) { e.DrawBackground(); e.DrawFocusRectangle(); object obj = listBox.Items[e.Index]; TextRenderer.DrawText(e.Graphics, obj.ToString(), e.Font, e.Bounds, e.ForeColor); }
リストから項目が削除されたときは、e.Indexに-1が渡されます。Remarks - DrawItemEventArgs.Index Property (System.Windows.Forms) | Microsoft Learn
項目にツールチップを表示する機能は用意されていないため、独自に実装する必要があります。
c# - How can I set different Tooltip text for each item in a listbox? - Stack Overflow