Solved

Owner-Drawn Colored ListBox

Posted on 2008-10-18
3
662 Views
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.'

NEED Help

thx
<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
        Get
            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
        Get
            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)
        Invalidate()
    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
        Else
            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)
        Else
            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.RemoveAt(e.Index)
                List.Items.Insert(e.Index, MyItem)
                e.ItemHeight = MyItem.ListBoxItemsStyle.Font.Height
                Return
            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

0
Comment
Question by:AhmedHindy
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
3 Comments
 
LVL 70

Accepted Solution

by:
Éric Moreau earned 500 total points
ID: 22752776
0

Featured Post

Enroll in May's Course of the Month

May’s Course of the Month is now available! Experts Exchange’s Premium Members and Team Accounts have access to a complimentary course each month as part of their membership—an extra way to increase training and boost professional development.

Question has a verified solution.

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

Suggested Solutions

Transparency shows that a company is the kind of business that it wants people to think it is.
Read about why it is more lucrative for an IT company to participate in government projects.
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…

738 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