views:

330

answers:

2
  1. Is there a way to color parts of ListBox Items (not only whole line)? For example listbox item consists of 5 words and only one is colored or 3 of 5.
  2. Is there a way to do the same with ListView? (I know that ListView can be colored per column but i would like to have multiple colors in one column).

I am interested in only free solutions, and preferred that they are not heavy to implement or change current usage (the least effort to introduce colored ListBox in place of normal one the better).

With regards,

MadBoy

+1  A: 

There is no built-in API which supports this type of modification to a WinForms ListBox or ListView. It is certainly possible to achieve this but the solution will involve a lot of custom painting and likely overriding WndProc. This will be a very involved and heavy solution.

If this type of experience is important to your application I think you should very seriously consider WPF as a solution. WPF is designed to provide this type of eye candy and there are likely many samples on the web to get you up and running.

JaredPar
Yes i am very keen to work with WPF but i should have picked WPF over 1 year ago, and not now when it's 90k lines of code (where GUI is like 30k lines). Porting it to WPF would be really a time killer.
MadBoy
+4  A: 

This article tells how to use DrawItem of a ListBox with DrawMode set to one of the OwnerDraw values. Basically, you do something like this:

listBox1.DrawMode = OwnerDrawFixed;
listBox1.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.listBox1_DrawItem);

private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
{
e.DrawBackground();
e.DrawFocusRectangle();
// TODO: Split listBox1.Items[e.Index].ToString() and then draw each separately in a different color
e.Graphics.DrawString(listBox1.Items[e.Index].ToString(),new Font(FontFamily.GenericSansSerif, 14, FontStyle.Bold),new SolidBrush(color[e.Index]),e.Bounds);
}

Instead of the single DrawString call, Split listBox1.Items[e.Index].ToString() into words and make a separate call to DrawString for each word. You'll have to replace e.bounds with an x,y location or a bounding rectangle for each word.

The same approach should work for ListView.

JeffH