PDA-applikationer med .NET: Lektion 9

Idag:
  • Manuell och automatisk databindning.
  • Debuggern i Visual Studio.

Klicka på startknappen i den lilla mediaspelaren ovan för att lyssna på lektionen. (Man kan behöva vänta en stund på att ljudfilen laddas ner.) Om mediaspelaren inte syns, eller om det inte fungerar av något annat skäl, kan man klicka här för att ladda ner mp3-filen (ca 21 minuter, ca 10 megabyte). Beroende på hur webbläsaren är konfigurerad kan det kräva ett separat mp3-spelarprogram av något slag.

Tänk på att lektionerna ger en översikt och introduktion. Du måste läsa i kursboken och (viktigast!) arbeta med övningarna för att tillgodogöra dig kursen.

Bild 1: En tillämpning: Svamparna

En ComboBox där man kan välja svampar. Vilka svampar som finns att välja på, beror på vilka man matat in.

Tillämpningen "Svamparna" i emulatorn

"Bild" 2: En lista med svampar

En ny medlemsvariabel i klassen Form1:

private ArrayList svamparna = new ArrayList();

Bild 3: Svamparna i designern

Tillämpningen "Svamparna" i emulatorn

"Bild" 4: Händelser som ska hanteras

  • ClickLägg till-knappen: lägg till svampnamnet i listan
  • ClickTa bort-knappen: ta bort svampnamnet ur listan
  • SelectedIndexChanged i svampväljar-comboboxen: uppdatera textrutan längst ner

"Bild" 5: Händelshanteraren för ClickLägg till-knappen

IntelliSense hjälper till med att tala om vad man kan göra, till exempel hur man lägger till och tar bort element i ArrayList:an svamparna.

Man får bättre hjäp om man skriver till exempel this.svamparna i stället för bara svamparna.

private void tillknappen_Click(object sender, System.EventArgs e)
{
        if (!svamparna.Contains(inmatningsrutan.Text)) {
                svamparna.Add(inmatningsrutan.Text);
                svampväljaren.Items.Add(inmatningsrutan.Text);
        }
}

"Bild" 6: Händelshanteraren för ClickTa bort-knappen

private void bortknappen_Click(object sender, System.EventArgs e)
{
        if (svamparna.Contains(inmatningsrutan.Text)) {
                svamparna.Remove(inmatningsrutan.Text);
                svampväljaren.Items.Remove(inmatningsrutan.Text);
        }
}

Bild 7: Programmet startar med en tom svamplista

Tillämpningen "Svamparna" i emulatorn

Bild 8: Vi lägger till en kantarell

Tillämpningen "Svamparna" i emulatorn

Bild 9: Nu finns kantarell i listan

Tillämpningen "Svamparna" i emulatorn

"Bild" 10: Händelshanteraren för SelectedIndexChanged i svampväljar-comboboxen

Den fullständiga programkoden för tillämpningen Svamparna kan laddas ner som Svamparna-1.cs.

private void svampväljaren_SelectedIndexChanged(object sender, System.EventArgs e)
{
        valutskriften.Text = "Du har valt " + svampväljaren.SelectedItem;
}

Bild(er) 11: När man väljer en svamp, uppdateras texten längst ner

Tillämpningen "Svamparna" i emulatorn     Tillämpningen "Svamparna" i emulatorn

Bild 12: Det här var "manuell databindning"

Händelsehanteraren för klick på knappen (tillknappen_Click):

Manuell databindning

Bild 13: Det finns också "automatisk databindning"

Vi kopplar ihop data (listan med svampar) och kontrollen (comboboxen med svampar) så att de "synkroniseras automatiskt".

Händelsehanteraren för klick på knappen (tillknappen_Click):

Automatisk databindning

"Bild" 14: Vi binder comboboxen svampväljaren till arrayen svamplistan

Lägg till i konstruktorn för fönsterklassen (Form1):

svampväljaren.DataSource = svamparna;
svampväljaren.DisplayMember = "Svampnamnet";
svampväljaren.ValueMember = "Svampnamnet";

"Bild" 15: Klassen Svamp med egenskaper

En klass som ska användas för automatisk databindning ska ha egenskaper ("properties").

class Svamp 
{
        private string namnet;
        public Svamp(string namn) 
        {
                namnet = namn;
        }
        public string Svampnamnet 
        {
                get { return namnet; }
                set { namnet = value; }
        }
} // class Svamp

"Bild" 16: Klassen Svamp med en Equals-metod

Två svampar med samma namn ska räknas som lika, till exempel när man letar efter en svamp i svamplistan. I C# kan man definiera en egen Equals-metod, på samma sätt som i Java (men i Java heter den equals).

class Svamp 
{
        private string namnet;
        public Svamp(string namn) 
        {
                namnet = namn;
        }
        public string Svampnamnet 
        {
                get { return namnet; }
                set { namnet = value; }
        }

        public override bool Equals(object o)
        {
                if (!(o is Svamp))
                        return false;
                return this.namnet == ((Svamp)o).namnet;
        }

        public override int GetHashCode()
        {
                return namnet.GetHashCode();
        }
} // class Svamp

"Bild" 17: Händelshanteraren för ClickLägg till-knappen

Funkar inte automatiskt. Vi måste binda om datakällan för att valen i comboxen ska uppdateras.

private void tillknappen_Click(object sender, System.EventArgs e) 
{
        string namnet = inmatningsrutan.Text;
        if (!svamparna.Contains(new Svamp(namnet))) 
        {
                svamparna.Add(new Svamp(namnet));
                svampväljaren.DataSource = null;
                svampväljaren.DataSource = svamparna;
                svampväljaren.DisplayMember = "Svampnamnet";
                svampväljaren.ValueMember = "Svampnamnet";
        }
}

"Bild" 18: Händelshanteraren för ClickTa bort-knappen

private void bortknappen_Click(object sender, System.EventArgs e)
{
        string namnet = inmatningsrutan.Text;
        if (svamparna.Contains(new Svamp(namnet))) 
        {
                svamparna.Remove(new Svamp(namnet));
                svampväljaren.DataSource = null;
                svampväljaren.DataSource = svamparna;
                svampväljaren.DisplayMember = "Svampnamnet";
                svampväljaren.ValueMember = "Svampnamnet";
        }
}

"Bild(er)" 19: Ändra även händelshanteraren för SelectedIndexChanged

Gamla, där svamparna var en lista av strängar:

private void svampväljaren_SelectedIndexChanged(object sender, System.EventArgs e)
{
        valutskriften.Text = "Du har valt " + svampväljaren.SelectedItem;
}

Nya, där svamparna är en lista av Svamp-objekt:

private void svampväljaren_SelectedIndexChanged(object sender, System.EventArgs e)
{
        valutskriften.Text = "Du har valt " + ((Svamp)svampväljaren.SelectedItem).Svampnamnet;
}

"Bild" 20: Inte så bra just för ComboBox

  • Man måste binda om efter varje ändring i arrayen - det ändras inte automatiskt.
  • Programmet kraschar (dvs, kastar ett undantag) om arrayen är tom när man kopplar ihop den med comboboxen.

Bild 21: Svamparna kraschar

Tillämpningen "Svamparna" med automatisk databindning i emulatorn och i debuggern

Bild 22: I debuggern ser vi var programmet kraschade

Tillämpningen "Svamparna" med automatisk databindning i emulatorn och i debuggern

Bild 23: Kraschen skedde inne i ComboBox-kontrollens programkod

Tillämpningen "Svamparna" med automatisk databindning i emulatorn och i debuggern

Bild 24: Vi sätter en ny brytpunkt lite tidigare

Tillämpningen "Svamparna" med automatisk databindning i emulatorn och i debuggern

Bild 25: Vi provkör en gång till, fram till brytpunkten

Tillämpningen "Svamparna" med automatisk databindning i emulatorn och i debuggern

Bild 26: Studera data

Tillämpningen "Svamparna" med automatisk databindning i emulatorn och i debuggern

Bild 27: Ändra programmet

Tillämpningen "Svamparna" med automatisk databindning i emulatorn och i debuggern

Bild 28: Nu funkar det! (Nåja, nästan i alla fall.)

Den fullständiga programkoden för tillämpningen Svamparna, i versionen med automatisk databindning, kan laddas ner som Svamparna-2.cs.

Tillämpningen "Svamparna" med automatisk databindning i emulatorn och i debuggern

Bild 29: Ett bättre exempel på automatisk databindning

En bättre användning av automatisk databindning

Läsanvisningar

Den här lektionen motsvaras av lite i inledningen av kapitel 8, Data Binding to Controls. Läs igenom sidorna 473-485 översiktligt, för att förstå att:
  1. En kontroll hör ofta ihop med en viss samling data, till exempel en array eller lista, så att kontrollen avspeglar vilka data som finns, och även att det användaren gör med kontrollen påverkar och ändrar data.
  2. Man kan skapa den kopplingen "manuellt", genom att kontrollens olika händelsehanterare ändrar i data och genom att man uppdaterar kontrollen varje gång data ändras av någon annan anledning.
  3. .NET har också stöd för att låta kontrollerna själva sköta den här synkroniseringen. Det kallas data binding.
Vi behöver inte kunna detaljerna om automatisk databindning.

Programmeringsövningar

  1. Återskapa tillämpningen Svamparna i det här kapitlet, varianten med manuell databindning.

Föregående lektion | Lektionslista | Nästa lektion


Thomas Padron-McCarthy (thomas.padron-mccarthy@oru.se), 31 oktober 2005