ListBox

プロパティ

プロパティ 内容 既定値
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 選択方法
  • None
  • One
  • MultiSimple
  • MultiExtended
SelectionMode.One
object SelectedItem 選択されている項目。選択されている項目がなければnull。Itemsに存在しない項目を指定すると、無視される。  
int SelectedIndex 選択されている項目のインデックス。選択されている項目がなければ-1。範囲外のインデックスを指定すると、ArgumentOutOfRangeExceptionが投げられる。SelectedIndex - ListBox.cs  
SelectedObjectCollection SelectedItems 選択されている項目のコレクション。複数選択のときに使用  
SelectedIndexCollection SelectedIndices 選択されている項目のインデックスのコレクション。複数選択のときに使用  
int TopIndex 最初に表示される項目のインデックス。スクロールバーが表示されているとき、これを指定することでスクロールさせて表示できる  
bool Sorted trueならば、項目がアルファベット順に並べ替えられる fales
       
プロパティ - ListBox クラス (System.Windows.Forms) | Microsoft Learn

Items

型はListBox.ObjectCollectionであり、個々の要素はobject型です。ListBox.Items プロパティ (System.Windows.Forms) | Microsoft Learn

DataSource

DataSourceを1つ以上の要素があるコレクションに設定するとSelectedIndexは0となり、最初の項目が選択されます。要素数が0のコレクションまたはnullを設定したときは、選択が解除されます。

ListControl.DataSource プロパティ (System.Windows.Forms) | Microsoft Learn

SelectedItem

ListViewなどとは異なり、フォーカスを失ったときに強調表示を解除する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;
};

DrawMode

描画モードを設定できます。ListBox.DrawMode プロパティ (System.Windows.Forms) | MSDN

DrawMode 列挙型
列挙子 描画方法 サイズ
Normal OSに委ねる すべての要素が同じ大きさ。フォントによって自動で決定
OwnerDrawFixed 独自に描画 すべての要素が同じ大きさ。ItemHeightプロパティで指定
OwnerDrawVariable 独自に描画 要素ごとに異なる大きさ。MeasureItemイベントのハンドラで指定する
DrawMode 列挙型 (System.Windows.Forms) | Microsoft Learn

DrawModeをOwnerDrawFixedまたはOwnerDrawVariableにすると、描画が必要なときにDrawItemイベントが発生し、そこで独自に描画できるようになります。

Width

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) 指定の座標にある項目のインデックスを取得できる
   
メソッド - ListBox クラス (System.Windows.Forms) | Microsoft Learn

イベント

イベント 発生タイミング
EventHandler DataSourceChanged DataSourceプロパティの値が変更されたとき
     
イベント - ListBox クラス (System.Windows.Forms) | Microsoft Learn

DataSourceChanged

listBox.DataSourceChanged += delegate
{
};

listBox.DataSource = new[] { 1, 2, 3 }; // DataSourceChangedイベントが発生する
listBox.DataSource = new[] { 1, 2, 3 }; // 再度、DataSourceChangedイベントが発生する。同値ではあるが、DataSourceのオブジェクトが変更されたため

SelectedIndexChanged

SelectedIndexまたはSelectedIndicesが変更されたときに発生します。ListBox.SelectedIndexChanged イベント (System.Windows.Forms) | Microsoft Learn

ただし実際には、たとえば選択されている項目がクリックされた場合のように、SelectedIndexが変更されていないときにもこのイベントは発生します。

DoubleClick

ListViewのItemActivateイベントのようにキーボードのEnterには応答しないため、その必要があるならばKeyDownイベントで処理します。

Format

FormattingEnabledプロパティがtrueに設定されているとき、表示されている各項目の書式が設定される前に発生します。Remarks - ListControl.FormattingEnabled Property (System.Windows.Forms) | Microsoft Learn

対象の項目をListControlConvertEventArgs.ListItemから取得して、ListControlConvertEventArgs.Valueに設定することで書式を変更できます。

オーナー描画するときにはこのイベントではなく、DrawItemのハンドラ内で書式化して描画します。

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
Microsoft Learnから検索