今更ながらC#の勉強をしています。
Accessのようにコンボボックスに複数の列を表示する方法です。
結構サンプルはあるんですが、いまいち複雑で汎用性がないのが多いので汎用性のあるものを書いてみました。
これがAccessバージョンです。
これをVisual C#で実現します。
最終的にこのようになります。
まずはデザインで通常のコンボボックスを置きます。
DrawModeはOwnerDrawFixedにします。
フォームのLoadイベントでコンボボックスの値を設定します。
このときコンボボックスのデータソースはDataTableにしてください。
基本的にコンボボックスの値はDBから取ると思いますのでこちらも汎用メソッドを適当なユーティリティクラスに作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
public static DataTable GetComboBoxData(String sql) { DataTable table = new DataTable(); var connection = new SqlConnection(new SqlConnectionStringBuilder() { DataSource = "localhost", InitialCatalog = "tmp", IntegratedSecurity = false, UserID = "sa", Password = "" }.ToString()); try { connection.Open(); var command = new SqlCommand(); command.Connection = connection; command.CommandText = sql; SqlDataAdapter adapter = new SqlDataAdapter(command); adapter.Fill(table); } finally { connection.Close(); } return table; } |
このメソッドを使用してコンボボックスに値を設定します。
1 2 3 4 5 |
private void Form1_Load(object sender, EventArgs e) { comboBox1.DataSource = Utility.GetComboBoxData("SELECT ID, Name, Age FROM AAA"); comboBox1.DisplayMember = "ID"; } |
Utility.GetComboBoxDataに表示したい列を含んだSQLを渡すだけです。
次に複数列を表示するためのstaticな以下のメソッドを適当なユーティリティクラスに書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public static void SetComboBoxAppearance(ComboBox cb, DrawItemEventArgs e, int[] fieldWidth, String[] fieldName) { DataTable dt = (DataTable)cb.DataSource; Pen p = new Pen(Color.Gray); Brush b = new SolidBrush(e.ForeColor); e.DrawBackground(); int width = 0; for (int i = 0; i < fieldName.Length; i++) { e.Graphics.DrawString(Convert.ToString(dt.Rows[e.Index][fieldName[i]]), e.Font, b, width, e.Bounds.Y); e.Graphics.DrawLine(p, width + fieldWidth[i], e.Bounds.Top, width + fieldWidth[i], e.Bounds.Bottom); width = width + fieldWidth[i]; } cb.DropDownWidth = width; if (Convert.ToBoolean(e.State & DrawItemState.Selected)) ControlPaint.DrawFocusRectangle(e.Graphics, e.Bounds); } |
これをコンボボックスのDrawItemイベントで呼び出します。
1 2 3 4 |
private void comboBox1_DrawItem(object sender, DrawItemEventArgs e) { Utility.SetComboBoxAppearance((ComboBox)sender, e, new int[] { 50, 100, 50 }, new string[] { "ID", "Name", "Age" }); } |
引数のint[]はそれぞれの列を表示する幅、string[]はコンボボックスに設定したデータのどの列を表示するかです。
引数の配列の数を増やせば何列でも表示可能です。
選択された値を取得する場合は以下のようにします。
1 |
lblAge.Text = ((DataRowView)comboBox1.SelectedItem).Row.Field<String>("Age").ToString(); |
最初のデータソース設定時に表示しない列も含んで設定しておけば、あとからその項目を取得することも可能です。
ただDrawItemイベントが遅くなるのが難点。
スポンサーサイト
アフィリエイトはエーハチネット
ドメイン取るならお名前.com