tagCANDY CGI VBレスキュー(花ちゃん) - VBレスキュー(花ちゃん)の投稿サンプル用掲示板 - Visual Basic 6.0 VB2005 VB2010
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ
VBレスキュー(花ちゃん)の投稿サンプル用掲示板
     サンプル投稿用掲示板  VB2005 〜 用トップページ  VB6.0 用 トップページ
オーナードローによるListBoxへの複数列表示(VB.NET) ( No.0 )  [親スレッドへ]
日時: 2007/09/14 22:31
名前: 花ちゃん

***********************************************************************************
* カテゴリー:[リストボックス][][]                                                *
* キーワード:オーナードロー,リストボックス,複数列表示,,,                        *
***********************************************************************************

元質問:習得したデータをリストボックス.. - タッチ  2004/05/01-11:44 No.832

データベースからデータを習得して、リストボックス内へ、列を揃えて表示させたいのですが、項目が四つほどあります。

-----------------------------------------------------------------------------------
Re^2: 習得したデータをリストボ.. - 魔界の仮面弁士 2004/05/05-13:17 No.838
-----------------------------------------------------------------------------------
> > データベースからデータを習得して、リストボックス内へ、列を揃えて表示させたいのですが、項目
> > が四つほどあります。
> そういう時は「ListBox」ではなく、「ListView」を利用された方がよろしいかと。

どうしてもListBoxの方が良ければ、オーナードローを使うという手もあります。

DrawItemイベント内を処理する必要があるため、コーディングは若干面倒になりますが、その分、
「文字の一部だけ色やフォントを変えたい」とか、「アイコンを表示させたい」などといった
要件にも、柔軟に対応することができます。

==================================
'管理を楽にするため、独自のクラスを定義します。
Public Class MyListItem
    Public ID As String
    Public Name As String
    Public Cost As Integer
    Public Customer As String
    Public Sub New(ByVal ID As String, ByVal Name As String, _
                   ByVal Cost As Integer, ByVal Customer As String)
        Me.ID = ID
        Me.Name = Name
        Me.Cost = Cost
        Me.Customer = Customer
    End Sub
    Public Overrides Function ToString() As String
        Return String.Format("{0}, {1}, {2:#,##0}円, {3}", _
                             Me.ID, Me.Name, Me.Cost, Me.Customer)
    End Function
End Class

'ListBoxの内容を自分で描画するためのコード
Private Sub ListBox1_DrawItem(ByVal sender As Object, _
                              ByVal e As System.Windows.Forms.DrawItemEventArgs _
                             ) Handles ListBox1.DrawItem
    Const Margin As Integer = 5I

    Dim Item As MyListItem = DirectCast(Me.ListBox1.Items(e.Index), MyListItem)
    Dim myPen As New Pen(Color.Brown)
    Dim Pos As PointF
    Dim B As Brush
    If e.State = DrawItemState.Selected Then
        B = SystemBrushes.HighlightText
    Else
        B = SystemBrushes.WindowText
    End If

    e.DrawBackground()
    With e.Graphics
        Pos = New PointF(Margin, e.Bounds.Y)
        .DrawString(Item.ID, e.Font, B, Pos)
        Pos.X += 40

        .DrawString(Item.Name, e.Font, B, Pos)
        Pos.X += 120

        Pos.X += 60
        .DrawString(Item.Customer, e.Font, B, Pos)

        '右揃えにするために、描画開始位置を変更する必要があるので、
        'MeasureStringメソッドを使って文字列の「幅」を測定しています。
        Dim ItemText As String = Item.Cost.ToString("#,##0円")
        .DrawString(ItemText, e.Font, B, _
                    Pos.X - .MeasureString(ItemText, e.Font).Width, Pos.Y)
    End With
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, _
                       ByVal e As System.EventArgs) Handles MyBase.Load
    Me.ListBox1.DrawMode = DrawMode.OwnerDrawFixed
    With Me.ListBox1.Items
        .Add(New MyListItem("1", "りんご", 30, "山田商店"))
        .Add(New MyListItem("02", "みかん", 50, "佐々木商店"))
        .Add(New MyListItem("003", "パイナップル", 150, "岬商店"))
        .Add(New MyListItem("004", "いちご", 20, "山下商店"))
    End With
End Sub


-------------------------------------------------------
上記実行結果の画像(画像をクリックすると元のサイズで見られます。)



 [スレッド一覧へ] [親スレッドへ]