4.オーナードローによる ComboBox での複数列表示(17_Cbo_04) (旧、SampleNo.176) |
1.オーナードローによる ComboBox での複数列表示 2. 3. 4. 5. 6. |
下記プログラムコードに関する補足・注意事項 動作確認:Windows 8.1 (Windows 7) / VB2013 (VB2010) / Framework 4.5.1 / 対象の CPU:x86 Option :[Compare Text] [Explicit On] [Infer On] [Strict On] Imports :追加なし 参照設定:追加なし その他 : : このサンプル等の内容を無断で転載、掲載、配布する事はお断りします。(私の修正・改訂・削除等が及ばなくなるので) 必要ならリンクをはるようにして下さい。(引用の場合は引用元のリンクを明記して下さい) |
1.オーナードローによる ComboBox での複数列表示 |
VB6.0 の時は、タブ位置を独自に設定して表示しておりましたが、VB2005 系ではオーナードローで描画できるので、下記に投稿された魔界の仮面弁士さんの ListBox でのコードを参考にさせて頂き作ってみました。 Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click '選択した項目を個別に取得する If ComboBox1.SelectedItem Is Nothing = False Then Dim si As MultiItem = DirectCast(ComboBox1.SelectedItem, MultiItem) Debug.WriteLine(si.ItemName) Debug.WriteLine(si.Volume) Debug.WriteLine(si.Price.ToString("#,##0 円")) End If End Sub '上記結果 '鉄火巻き '1貫 '200 Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged If ComboBox1.SelectedItem Is Nothing Then MessageBox.Show("項目がが選択されていません。") Else Dim si As MultiItem = DirectCast(ComboBox1.SelectedItem, MultiItem) Dim msg As String = si.ItemName & vbCrLf & si.Volume & vbCrLf & si.Price.ToString("#,##0 円") _ & vbCrLf & "が選択されました。" MessageBox.Show(msg) End If End Sub Private Sub ComboBox1_DrawItem(sender As Object, e As DrawItemEventArgs) Handles ComboBox1.DrawItem e.DrawBackground() Dim mi As MultiItem = DirectCast(Me.ComboBox1.Items(e.Index), MultiItem) Dim b As Brush = SystemBrushes.WindowText '通常の表示色 If e.State = DrawItemState.Selected Then b = SystemBrushes.HighlightText '選択時の反転色 End If '金額(数値)を書式付文字列に変換 Dim strPrice As String = mi.Price.ToString("#,##0 円") '右揃えで表示する為に、strPrice の長さ(Pixel)を取得 Dim si As Integer = CInt(e.Graphics.MeasureString(strPrice, e.Font).Width) With e.Graphics '1列目の表示位置等の設定 & 表示 .DrawString(mi.ItemName, e.Font, b, New PointF(0, e.Bounds.Y)) .DrawString(mi.Volume, e.Font, b, New PointF(110, e.Bounds.Y)) '3列目の表示位置等の設定 & 右寄せ表示 .DrawString(strPrice, e.Font, b, New PointF(250 - si, e.Bounds.Y)) End With End Sub Public Class MultiItem Public ItemName As String Public Volume As String Public Price As Integer Public Sub New(ByVal ItemName As String, ByVal Volume As String, _ ByVal Price As Integer) Me.ItemName = ItemName Me.Volume = Volume Me.Price = Price End Sub Public Overrides Function ToString() As String '取り出し時は入力時の状態に戻す Return String.Format("{0}, {1}, {2:###0}", Me.ItemName, Me.Volume, Me.Price) End Function End Class Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Me.ComboBox1.DrawMode = DrawMode.OwnerDrawFixed With Me.ComboBox1 .Items.Add(New MultiItem("イカ", "1貫", 200)) .Items.Add(New MultiItem("ウニ", "1貫", 300)) .Items.Add(New MultiItem("エビ", "1貫", 250)) .Items.Add(New MultiItem("たまご", "1貫", 150)) .Items.Add(New MultiItem("鉄火巻き", "1貫", 200)) .Items.Add(New MultiItem("トロ", "1貫", 500)) .Items.Add(New MultiItem("特上盛合せ", "3人前", 5500)) .Items.Add(New MultiItem("上盛合せ", "3人前", 3500)) .Text = "メニューを選択してください" .BackColor = Color.PowderBlue .Font = New Font("MS Pゴシック", 12) End With End Sub End Class 図1.上記実行結果 |
2. |
3. |
4. |
5. |
6. |
検索キーワード及びサンプルコードの別名(機能名) |
オーナードロー 複数列表示 コンボボックス |