Abso-freakin-lutely! ;)
Kod bindovanja ovih prostijih kontrola na objekte iz kolekcije - moraš voditi računa o tome da unutar tog objekta ručno implementiraš ToString() funkciju, jer kontrole prikazuju na ekranu ono što vraća funkcija ToString() bilo to ComboBox, ListBox itd. Vidjećeš da funkcija ToString() vraća mNaziv, u protivnom da nije implementirana - vraćala bi uvijek naziv tipa klase - (WindowsApplication1.Playground), što nije baš user-friendly.
Elem, da ne dužim mnogo sa tekstom - svi komentari su u kod-u:
Code:
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
// Deklarisem jednu kolekciju objekata Playground
private List<Playground> Playgrounds = new List<Playground>();
public Form1()
{
InitializeComponent();
}
private void button2_Click(object sender, EventArgs e)
{
lisPlayground.DrawMode = DrawMode.OwnerDrawFixed;
// Dodajem nekoliko novih objekata Playground u kolekciju
Playgrounds.Add(new Playground("Playground #1", Color.Blue));
Playgrounds.Add(new Playground("Playground #2", Color.Pink));
Playgrounds.Add(new Playground("Playground #3", Color.Green));
Playgrounds.Add(new Playground("Playground #4", Color.Olive));
// Vezujem DataSource kontrole za kolekciju
lisPlayground.DataSource = Playgrounds;
}
private void lisPlayground_DrawItem(object sender, DrawItemEventArgs e)
{
if (e.Index == -1)
return;
SolidBrush TekstBrush;
SolidBrush PozadinaBrush;
Font TekstFont;
// Neka, recimo, tekst slova biva odredjen parametrom Color iz objekta Playground
TekstBrush = new SolidBrush(((Playground)lisPlayground.Items[e.Index]).Color);
// Boje pozadine neka, recimo, budu vec predodredjene kao ranije
if (e.Index % 2 == 0)
{
PozadinaBrush = new SolidBrush(Color.Gray);
}
else
{
PozadinaBrush = new SolidBrush(Color.DimGray);
}
// Nasa famozna provjera :-))
if ((int) e.State != 768)
{
PozadinaBrush = new SolidBrush(Color.Black);
TekstBrush = new SolidBrush(Color.Yellow);
TekstFont = new Font(Form.DefaultFont.Name, Form.DefaultFont.Size, FontStyle.Bold);
}
else TekstFont = new Font("Lucida Console", 8.25F, System.Drawing.FontStyle.Regular,
System.Drawing.GraphicsUnit.Point, ((byte)(238)));
// Ostalo, isto kao ranije
e.Graphics.FillRectangle(PozadinaBrush, e.Bounds);
RectangleF R = new RectangleF(e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height);
e.Graphics.DrawString(lisPlayground.Items[e.Index].ToString(), TekstFont, TekstBrush, R);
e.DrawFocusRectangle();
}
}
public class Playground
{
// Jedan simpaticni konstruktor, kako bi lakse dodjeljivali vrijednosti parametrima
// Elem, Visual Studio 2008 uvodi novitet, pa nam ovo ne treba - ali ne znam koju verziju koristis
public Playground(string vNaziv, Color vColor)
{
this.mNaziv = vNaziv;
this.mColor = vColor;
}
private string mNaziv;
public string Naziv
{
get { return mNaziv; }
set { mNaziv = value; }
}
private Color mColor;
public Color Color
{
get { return mColor; }
set { mColor = value; }
}
// Najvazniji momenat - ovdje se odredjuje sta ce biti prikazano u listbox-u za
// svaku pojedinacnu stavku
public override string ToString()
{
return this.mNaziv;
}
}
}
Nadam se da će biti od koristi. :-)