ListBox
Børre Stenseth
Moduler>GUI-komponenter>Lister

Enkel listeboks

Hva
Enkle listebokser

Listebokser er relativt greie å ha med å gjøre. I denne modulen skal vi lage en enkel løsning der vi putter (referanser til) objekter inn i en listeboks, for så å kunne velge dem ved å klikke i lista.

screen

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);
    }
}
Referanser
  • Prosjektet:
    https://svn.hiof.no/svn/psource/Csharpspikes/listbox1
Vedlikehold

B. Stenseth, januar 2009

(Velkommen) Moduler>GUI-komponenter>Lister (Bilder)