Royal Pinto
Royal Pinto

Reputation: 183

How to Add Custom Objects in to listbox of VB 2010

I am developing one vb application. In that I have one list box. I want to add different types of Items. Like Different Colored and differently aligned text(Like one item item is right aligned and one more is left aligned). Can you please tell me how can i do the same.

Thanks.

Upvotes: 0

Views: 1711

Answers (2)

Olivier Jacot-Descombes
Olivier Jacot-Descombes

Reputation: 112632

This is how I did it in one of my projects (the original code is in c#):

Public Class ColoringStepCommandListBox
    Inherits CommandListBox

    Const ItemHeight As Integer = 20

    Public Sub New()
        listBox.ItemHeight = ItemHeight
        listBox.DrawMode = DrawMode.OwnerDrawFixed
    End Sub

    Protected Overrides Sub OnDrawItem(sender As Object, e As DrawItemEventArgs)
        Const  textFormatFlags__1 As TextFormatFlags = TextFormatFlags.EndEllipsis Or TextFormatFlags.PreserveGraphicsClipping Or TextFormatFlags.VerticalCenter
        Const  colorRectangleWidth As Integer = 100, textLeft As Integer = 110

        If e.Index >= 0 Then
            'Cast the listbox item to your custom type (ColoringStep in my example).
            Dim coloringStep = TryCast(listBox.Items(e.Index), ColoringStep)

            e.DrawBackground()

            'Do custom coloring and rendering, draw icons etc.
            Dim colorRect = New Rectangle(2, e.Bounds.Top + 2, colorRectangleWidth, ItemHeight - 5)
            Dim innerRect = New Rectangle(colorRect.Left + 1, colorRect.Top + 1, colorRect.Width - 1, colorRect.Height - 1)
            e.Graphics.DrawRectangle(Pens.Black, colorRect)
            DrawingHelper.DrawGradient(coloringStep, e.Graphics, innerRect, LinearGradientMode.Horizontal)

            'Draw the text (this does not happen automatically any more with owner draw modes).
            Dim textRect = New Rectangle(textLeft, e.Bounds.Top, e.Bounds.Width - textLeft, e.Bounds.Height)
            TextRenderer.DrawText(e.Graphics, coloringStep.ToString(), e.Font, textRect, e.ForeColor, textFormatFlags__1)

            e.DrawFocusRectangle()
        End If
    End Sub
End Class

Upvotes: 1

Royal Pinto
Royal Pinto

Reputation: 183

I got simple solution for this. Below is the code

Private Sub ListBox1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles ListBox1.DrawItem
    e.DrawBackground()
    Dim textFont As New Font(e.Font.FontFamily, e.Font.Size * 4)
    e.Graphics.DrawString(ListBox1.Items(e.Index).ToString(), textFont, New SolidBrush(Color.BlueViolet), RectangleF.op_Implicit(e.Bounds))
    e.DrawFocusRectangle()
End Sub

Private Sub listBox1_MeasureItem(ByVal sender As Object, ByVal e As System.Windows.Forms.MeasureItemEventArgs) Handles ListBox1.MeasureItem
    e.ItemHeight = e.ItemHeight * 4
End Sub

You can add extra code inside ListBox1_DrawItem method to customize Items

Upvotes: 0

Related Questions