Anhand eines kleinen Beispiels möchten wir Ihnen zeigen, wie sich die Anzeige von Daten im Standard ListBox-Control von VB.NET mehrspaltig realisieren lässt. Die Daten selbst verwalten wir in einer kleinen Klasse mit folgenden Membern: ID, KundenNr, Name und Telefon. Public Class MyListData Private m_ID As Integer Private m_KundenNr As String Private m_Name As String Private m_Telefon As String ' Direktes Initialisieren mit Daten ermöglichen Public Sub New(ByVal ID As Integer, ByVal KundenNr As String, _ ByVal Name As String, ByVal Telefon As String) m_ID = ID m_KundenNr = KundenNr m_Name = Name m_Telefon = Telefon End Sub ' Eigenschaften Public Property ID() As Integer Get Return m_ID End Get Set(ByVal value As Integer) m_ID = ID End Set End Property Public Property KundenNr() As String Get Return m_KundenNr End Get Set(ByVal value As String) m_KundenNr = value End Set End Property Public Property Name() As String Get Return m_Name End Get Set(ByVal value As String) m_Name = value End Set End Property Public Property Telefon() As String Get Return m_Telefon End Get Set(ByVal value As String) m_Telefon = value End Set End Property Public Overrides Function ToString() As String Return m_Name End Function End Class Nun ziehen wir ein ListBox-Control auf die Form und füllen die Liste mit ein paar Testdaten: Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load ' ListBox mit Daten fülllen With ListBox1.Items .Add(New MyListData(1, "00001", "Otter Dieter", "(09708) 706247")) .Add(New MyListData(2, "00002", "Max Mustermann", "(00000) 99999")) .Add(New MyListData(3, "00003", "Hans Meier", "")) End With ' OwnerDraw setzen (wir zeichnen den Inhalt selbst!) ListBox1.DrawMode = DrawMode.OwnerDrawFixed End Sub Um die ListBox-Einträge mehrspaltig anzeigen zu können, müssen wir die DrawMode-Eigenschaft auf den Wert "DrawMode.OwnerDrawFixed" festlegen. Das bewirkt, dass bei jedem zu zeichnenden ListBox-Eintrag das DrawItem-Ereignis ausgelöst wird. Und das ist dann genau die richtige Stelle für unsere "Zeichenroutine". Private Sub ListBox1_DrawItem(ByVal sender As Object, _ ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles ListBox1.DrawItem ' ListBox-Eintrag selbst zeichnen ' Beispiel: 3 Spalten (KundenNr, Name und Telefon) If e.Index < 0 Then Exit Sub ' Daten, die angezeigt werden sollen Dim myData As MyListData = DirectCast(ListBox1.Items(e.Index), MyListData) ' Schriftart festlegen Dim oFont As Font = ListBox1.Font ' Brush-Objekt mit Farbwert für die Anzeige der Zeile Dim oBrush As New SolidBrush(e.ForeColor) ' Hintergrund des aktuellen Eintrags zeichnen e.DrawBackground() ' jetzt die einzelnen Texte in 3 Spalten anzeigen With e.Graphics ' KundenNr .DrawString(myData.KundenNr, oFont, oBrush, e.Bounds.X, e.Bounds.Y) ' Name (im vorgegebenen Rechteck zeichnen, damit letzte Spalte ' nicht "überschrieben" wird) .DrawString(myData.Name, oFont, oBrush, New RectangleF( _ e.Bounds.X + 50, e.Bounds.Y, e.Bounds.Right - e.Bounds.X - 132, e.Bounds.Height)) ' Telefon-Nr. .DrawString(myData.Telefon, oFont, oBrush, e.Bounds.X + e.Bounds.Width - 80, e.Bounds.Y) End With ' Objekte freigeben oBrush.Dispose() End Sub Starten Sie das Projekt - et voilà: Die Daten werden 3-spaltig in der ListBox angezeigt. |