none
Listbox with Alternate Row Colors

    Question

  • Hola,

     

    I know how to have alternate row colors with ListView.  But how about with ListBox?  I've run a search.  I read in some web sites where they say you can't.  Is that true?  Meanwhile, I've done something like

     

    For i As Integer = 0 To ListBox1.Items.Count - 1 Step 1
    	If i Mod 2 = 0 Then
    		ListBox1. BackColor = Color.FromArgb(150, 250, 255)
    	Else
    		ListBox1. BackColor = Color.White
    	End If
    Next i

    with ListBox's DrawItem event.  And it doesn't work.  If you can't have alternate row colors with ListBox, that's a big disappointment with Visual Basic for me.

     

    Muchas gracias,

     

    Onion


    Onion is a recent refuge from Mac OS X and hates Mac App Store. System: Windows 7 x64
    Saturday, November 19, 2011 7:27 AM

Answers

  • Here is an example:

    this is a list box where the back color of every other row is  light gray

     

    Public Class Form1
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
            For x = 1 To 20
                ListBox1.Items.Add("Crazypennie " & CStr(x))
            Next
    
            ListBox1.DrawMode = DrawMode.OwnerDrawFixed
            ListBox1.ItemHeight += 5
        End Sub
    
    
        Private Sub ListBox1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles ListBox1.DrawItem
            If e.Index Mod 2 = 0 Then
                e.Graphics.FillRectangle(Brushes.LightGray, e.Bounds)
            End If
            If ListBox1.SelectedIndex = e.Index Then
                e.Graphics.FillRectangle(Brushes.Blue, e.Bounds)
                e.Graphics.DrawString(ListBox1.Items(e.Index).ToString, Me.Font, Brushes.White, 0, e.Bounds.Y + 2)
            Else
                e.Graphics.DrawString(ListBox1.Items(e.Index).ToString, Me.Font, Brushes.Black, 0, e.Bounds.Y + 2)
            End If
        End Sub
    
        Private Sub ListBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
            ListBox1.Refresh()
        End Sub
    End Class
    • Edited by Crazypennie Saturday, November 19, 2011 11:35 AM
    • Proposed as answer by Xiong Wei, Jin Saturday, November 19, 2011 10:58 PM
    • Marked as answer by Onion Ring Saturday, November 19, 2011 11:06 PM
    Saturday, November 19, 2011 11:22 AM

All replies

  • Yes it is true if you want to do this with Windows Forms, 

    That is why they created WPF.

    You can also search for 3th party listboxes.

     


    Success
    Cor
    Saturday, November 19, 2011 9:03 AM
  • The Items are undefined objects.  Thus, they can be anything you wish.  You have control of any drawing through the DrawMode property.  You can pretty much do anything you wish.


    • Edited by JohnWein Saturday, November 19, 2011 10:02 AM
    Saturday, November 19, 2011 10:00 AM
  • Oh, no...

     

    ...


    Onion is a recent refuge from Mac OS X and hates Mac App Store. System: Windows 7 x64
    Saturday, November 19, 2011 10:04 AM
  • Here is an example:

    this is a list box where the back color of every other row is  light gray

     

    Public Class Form1
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
            For x = 1 To 20
                ListBox1.Items.Add("Crazypennie " & CStr(x))
            Next
    
            ListBox1.DrawMode = DrawMode.OwnerDrawFixed
            ListBox1.ItemHeight += 5
        End Sub
    
    
        Private Sub ListBox1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles ListBox1.DrawItem
            If e.Index Mod 2 = 0 Then
                e.Graphics.FillRectangle(Brushes.LightGray, e.Bounds)
            End If
            If ListBox1.SelectedIndex = e.Index Then
                e.Graphics.FillRectangle(Brushes.Blue, e.Bounds)
                e.Graphics.DrawString(ListBox1.Items(e.Index).ToString, Me.Font, Brushes.White, 0, e.Bounds.Y + 2)
            Else
                e.Graphics.DrawString(ListBox1.Items(e.Index).ToString, Me.Font, Brushes.Black, 0, e.Bounds.Y + 2)
            End If
        End Sub
    
        Private Sub ListBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
            ListBox1.Refresh()
        End Sub
    End Class
    • Edited by Crazypennie Saturday, November 19, 2011 11:35 AM
    • Proposed as answer by Xiong Wei, Jin Saturday, November 19, 2011 10:58 PM
    • Marked as answer by Onion Ring Saturday, November 19, 2011 11:06 PM
    Saturday, November 19, 2011 11:22 AM
  •  If you can't have alternate row colors with ListBox, that's a big disappointment with Visual Basic for me.


    Keep in mind that this is not an issue with Visual Basic, rather it is with the MS team that designed the WonForms controls.  And you wouldn't be the first person to complain that MS skimped out on development of these controls.  However, they were never intended to be highly customizable like, say, 3rd party control suites such as DevExpress or Telerik.  My belief is regarding the intention of the design team was that they provided an "adequate" set of controls that could be used as-is for most scenarios but could also be customized through inheritance or through the rich set of events that are exposed should the need arise.  Additionally there is the UserControl base class that allows you to make your own controls.  That's a journey in itself ;)

    It's pretty clear that MS is not avidly in the business of developing control suites, so as a developer wishing to push controls to the limits you may want to consider either paying for control suites or looking for free code of others who have customized WinForms controls.  These can be found in places like CodePlex, CodeProject, or many other repositories for code examples and articles.

    Saturday, November 19, 2011 9:33 PM
  • Thanks, Crazypennie.

     

    It doesn't work for me, though.


    Onion is a recent refuge from Mac OS X and hates Mac App Store. System: Windows 7 x64
    Saturday, November 19, 2011 9:45 PM
  • Thanks, Crazypennie.

     

    It doesn't work for me, though.


    Onion is a recent refuge from Mac OS X and hates Mac App Store. System: Windows 7 x64


    Can you be more specific please?  What didn't work for you?  I tried the code and it made the listbox have alternating colors for the items collection.

    And for the record when considering what I wrote above about MS's attitude towrd controls, CrazyPennie's solution is a pretty quick and easy one.  It should be a testament to the flexibility they built into the WinForms control suite... at least for easy to medium-difficulty modifications like this.

    Saturday, November 19, 2011 10:53 PM
  • After I removed

     

    For x = 1 To 20
                ListBox1.Items.Add("Crazypennie " & CStr(x))
    Next


    from the first set, it works.

     

    Thanks.

     


    Onion is a recent refuge from Mac OS X and hates Mac App Store. System: Windows 7 x64
    Saturday, November 19, 2011 11:06 PM