Owner-Drawn Colored ListBox

Posted on 2008-10-18
Last Modified: 2013-11-25
I'm trying to develop an Owner-Drawn ListBox and here is what i did :

I'm trying to apply a new property called "AlternatingItemsCellStyle", like the one in the DataGridView Control , but i have some problems implementing it.
I have some classes like "ListBoxCellStyle" which have some properties like -- forecolor, backcolor, selectionforecolor, selectionbackcolor and font property.
i also implement a type converter for that cellstyle and a custom item to be added to the listbox
but that code doesn't work when i added some items to the list nothing changed.
I attached a test form to test that list but , every time i'm trying to run the form i get a strange error messagsays 'Assembly 'C:\Documents and Settings\~~~\Desktop\~~~\~~~\obj\Debug\~~~~.dll' doesn't contain any UserControl types.'


<ToolboxBitmap(GetType(ListBox))> _

<DefaultProperty("AlternatingItemsCellStyle")> _

<DefaultEvent("SelectedIndexChanged")> _

Public Class ColoredListBox

    Inherits ListBox

    Private _DrawMode As DrawMode = Windows.Forms.DrawMode.OwnerDrawVariable

    <DefaultValue(GetType(DrawMode), "OwnerDrawVariable")> _

    Public Overloads Property DrawMode() As DrawMode


            Return _DrawMode

        End Get

        Set(ByVal Value As DrawMode)

            _DrawMode = Value

        End Set

    End Property

    Private _AlternatingItemsCellStyle As ListBoxCellStyle = New ListBoxCellStyle

    '<DefaultValue(GetType(ListBoxCellStyle), "(White), (Black), (Maroon), (255, 224, 192), (Tahoma, 8pt)")> _

    <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _

    Public Property AlternatingItemsCellStyle() As ListBoxCellStyle


            Return _AlternatingItemsCellStyle

        End Get

        Set(ByVal Value As ListBoxCellStyle)

            _AlternatingItemsCellStyle = Value

            AddHandler _AlternatingItemsCellStyle.AlternatingCellStyleChanged, AddressOf AlternatingCellStyleChanged

        End Set

    End Property

    Private Sub AlternatingCellStyleChanged(ByVal sender As Object, ByVal e As EventArgs)


    End Sub

    Private Sub ColoredListBox_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles Me.DrawItem

        Dim List As ListBox = CType(sender, ListBox)

        Dim Item As FormattedListItem = Nothing

        If TypeOf List.Items(e.Index) Is FormattedListItem Then

            Item = CType(List.Items(e.Index), FormattedListItem)

        End If

        Dim Font As Font = Nothing

        Dim ForeColor As Color = Color.Empty

        Dim BackColor As Color = Color.Empty

        Dim SelectionForeColor As Color = Color.Empty

        Dim SelectionBackColor As Color = Color.Empty

        If Item IsNot Nothing Then

            Font = Item.ListBoxItemsStyle.Font

            ForeColor = Item.ListBoxItemsStyle.ForeColor

            BackColor = Item.ListBoxItemsStyle.BackColor

            SelectionForeColor = Item.ListBoxItemsStyle.SelectionForeColor

            SelectionBackColor = Item.ListBoxItemsStyle.SelectionBackColor


            Font = List.Font

            ForeColor = List.ForeColor

            BackColor = List.BackColor

            SelectionForeColor = System.Drawing.SystemColors.HighlightText

            SelectionBackColor = System.Drawing.SystemColors.Highlight

        End If

        Dim ForeBrush As Brush

        Dim BackBrush As Brush

        If (e.State And DrawItemState.Selected) = DrawItemState.Selected Then

            ForeBrush = New SolidBrush(SelectionForeColor)

            BackBrush = New SolidBrush(SelectionBackColor)


            ForeBrush = New SolidBrush(ForeColor)

            BackBrush = New SolidBrush(BackColor)

        End If

        e.Graphics.FillRectangle(BackBrush, e.Bounds)

        Dim Text As String = List.Items(e.Index).ToString

        e.Graphics.DrawString(Text, Font, ForeBrush, e.Bounds.X, e.Bounds.Y)

    End Sub

    Private Sub ColoredListBox_MeasureItem(ByVal sender As Object, ByVal e As System.Windows.Forms.MeasureItemEventArgs) Handles Me.MeasureItem

        Dim List As ListBox = CType(sender, ListBox)

        If (IsPrimeNumber(e.Index)) Then

            Dim MyItem As New FormattedListItem(List.Items(e.Index), Me.AlternatingItemsCellStyle)

            If MyItem.ListBoxItemsStyle.Font IsNot Nothing Then


                List.Items.Insert(e.Index, MyItem)

                e.ItemHeight = MyItem.ListBoxItemsStyle.Font.Height


            End If

        End If

    End Sub

    Private Function IsPrimeNumber(ByVal [Number] As Integer) As Boolean

        Dim TheDouble As Double

        TheDouble = Double.Parse(([Number] / 2))

        If TheDouble.ToString.Contains(".") Then

            Return True

        End If

        Return False

    End Function

End Class

Open in new window

Question by:AhmedHindy
LVL 69

Accepted Solution

Éric Moreau earned 500 total points
ID: 22752776

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

If you are using Scrum Framework or another agile process, a retrospective may be part of it. Does your team perform retrospectives? Are you getting value from your retrospectives? I see a common anti-pattern when people conduct a retrospective f…
Documentation is a big contentious issue in Agile. There is a reason for this. When you start your presentation on Agile you start by going through the 4 statements of agile manifesto (…
Migrating to Microsoft Office 365 is becoming increasingly popular for organizations both large and small. If you have made the leap to Microsoft’s cloud platform, you know that you will need to create a corporate email signature for your Office 365…
With the power of JIRA, there's an unlimited number of ways you can customize it, use it and benefit from it. With that in mind, there's bound to be things that I wasn't able to cover in this course. With this summary we'll look at some places to go…

920 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

20 Experts available now in Live!

Get 1:1 Help Now