| タイトル | : Re^2: 習得したデータをリストボックス内で、列を揃えて表示させるにはどうすればよいでしょうか  |  
| 記事No | : 838 |  
| 投稿日 | : 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 
 
 |