tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^2: 習得したデータをリストボックス内で、列を揃えて表示させるにはどうすればよいでしょうか
投稿日: 2004/05/05(Wed) 13:17
投稿者魔界の仮面弁士
> > データベースからデータを習得して、リストボックス内へ、列を揃えて表示させたいのですが、項目
> > が四つほどあります。
> そういう時は「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

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。