Enkel listeboks

Vi definerer en svært enkel personklasse:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace listbox1 { class person { String m_navn; // name int m_faar; // year of birth public person(string navn, int faar) { m_navn = navn; m_faar = faar; } public string Name { get { return m_navn; } set { m_navn=value; } } public int BirthYear { get { return m_faar; } set { m_faar = value; } } public int Age { get { return DateTime.Now.Year-m_faar; } } // we can do this for the person too /* public override string ToString() { return m_navn; } */ } }
Merk at vi ka redefinere (override) metoden ToString(). Dette kan vi gjøre i alle klasser siden ToString() er definert i klassen Object, som er alle klasseres basisklasse. Grunnen til ToString() er definert som en slik fundamental metode er at alle objekter skal kunne ha en enkel, standardisert måte å vise seg fram på, f.eks. i lister. Dersom vi hadde kalt metoden ToString(), uten å redefinere den, ville alle personer ha presentert seg som: "listbox1.person" (namespace.class). Greitt nok i de sammenhenger det er interessant å finne ut hva slags klasse et objekt er en forekomst av, men ganske unyttig dersom vi skal skille mellom personer.
Vi initierer listepresentasjonen slik:
public Form1() { InitializeComponent(); // Decide which property that will show in listbok // ValueMember can also be set in designeditor listBoxPersoner.ValueMember = "Name"; // Alternativ is to override ToString() in class person // put some persons in the listbox /* // alternative1: PList = new List<person>(4); PList.Add(new person("ole",1972)); PList.Add(new person("kari",1973)); listBoxPersoner.Items.AddRange(PList.ToArray()); // alternative 2: listBoxPersoner.Items.Add(new person("ole", 1972)); listBoxPersoner.Items.Add(new person("kari", 1973)); */ // alternative 3: // if we have defined a bindingsource in the editor personBindingSource.Add(new person("ole", 1972)); personBindingSource.Add(new person("kari", 1973)); listBoxPersoner.Refresh(); }
Merk at her har vi valgt å sette egenskapen "ValueMember" i listeboksen. Det betyr at når en person legegs inn i lista vil egenskapen "Name" representere personen i lista. Vi velger altså for demonstrasjonens skyld denne løsningen i stedet for å redefinere ToString(). Dersom vi angir en annen verdi enn en av de som finnes som egenskaper (property) i person-klassen, så får vi uten videre feilmeldinger den defaulte ToString()-løsningen: listbox1.person.
Merk at vi har laget tre alternativer. Det siste alternativet forutsetter at vi har definert en BindingSource i design-fasen. DataSource for BindingSource er satt til person-objektet. Videre har vi koplet denne BindingSource'en til listeboksen.
Et klikk i lista handteres slik:
private void listBoxPersoner_SelectedIndexChanged(object sender, EventArgs e) { if (listBoxPersoner.SelectedItem!=null) { person p = (person)listBoxPersoner.SelectedItem; labelPerson.Text = String.Format("{0} er {1} år gammel", p.Name, p.Age); } }