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);
}
}












