ComboBoxでユーザーに入力制限したい場合、DropDownStyleプロパティでDropDownListを選択すれば簡単です。
しかし、デフォルトでは背景を変更することができず、FlatStyleをFlatに変更すると、レイアウトが「コレジャナイ」となってしまいます。
そこで、見た目をDropDown(DropDownStyle=DropDown)風にしてみます。
※OSのバージョンによって、異なる場合があります。今回はWindows10で確認しています。
ComboBoxのプロパティ変更
DrawModeプロパティをNormalからOwnerDrawFixedに変更するだけです。
これにより、内容の描画を自分で行います。
変更前
プロパティ名 | 値 |
---|---|
BackColor | Window |
DropDownStyle | DropDownList |
DrawMode | Normal |
FlatStyle | Standard |
ForeColor | Window Text |
変更後
プロパティ名 | 値 |
---|---|
BackColor | Window |
DropDownStyle | DropDownList |
DrawMode | OwnerDrawFixed |
FlatStyle | Standard |
ForeColor | Window Text |
ComboBoxの内容の描画
DrawModeをNormal以外にした場合は、DrawItemイベントで内容を描画する必要があります。
public Form1() { InitializeComponent(); string[] items = new string[] { "1", "2", "3" }; comboBox1.Items.AddRange(items); } private void comboBox1_DrawItem(object sender, DrawItemEventArgs e) { if (e.Index < 0) return; e.DrawBackground(); // 選択時は青い背景となるので、文字を白くする bool selected = DrawItemState.Selected == (e.State & DrawItemState.Selected); var brush = (selected) ? Brushes.White : Brushes.Black; e.Graphics.DrawString(comboBox1.Items[e.Index].ToString(), e.Font, brush, e.Bounds, StringFormat.GenericDefault ); e.DrawFocusRectangle(); }
結果
Before
After