- 日時: 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
------------------------------------------------------- 上記実行結果の画像(画像をクリックすると元のサイズで見られます。)
|