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. "Bild" 2: En lista med svampar En ny medlemsvariabel i klassen Form1: private ArrayList svamparna = new ArrayList(); Bild 3: Svamparna i designern "Bild" 4: Händelser som ska hanteras Click på Lägg till-knappen: lägg till svampnamnet i listan Click på Ta bort-knappen: ta bort svampnamnet ur listan SelectedIndexChanged i svampväljar-comboboxen: uppdatera textrutan längst ner "Bild" 5: Händelshanteraren för Click på Lä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 Click på Ta 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 Bild 8: Vi lägger till en kantarell Bild 9: Nu finns kantarell i listan "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 Bild 12: Det här var "manuell databindning" Händelsehanteraren för klick på knappen (tillknappen_Click): Ändrar i data (listan med svampar) Ändrar också i kontrollen (comboboxen med svampar) 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): Ändrar bara i data (listan med svampar) Ändrar inte i kontrollen (comboboxen med svampar) "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 Click på Lä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 Click på Ta 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 Bild 22: I debuggern ser vi var programmet kraschade Bild 23: Kraschen skedde inne i ComboBox-kontrollens programkod Bild 24: Vi sätter en ny brytpunkt lite tidigare Bild 25: Vi provkör en gång till, fram till brytpunkten Bild 26: Studera data Bild 27: Ändra programmet 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. Bild 29: Ett bättre exempel på 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: 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. 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. .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 Å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@tech.oru.se), 31 oktober 2005
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.
private ArrayList svamparna = new ArrayList();
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); } }
private void bortknappen_Click(object sender, System.EventArgs e) { if (svamparna.Contains(inmatningsrutan.Text)) { svamparna.Remove(inmatningsrutan.Text); svampväljaren.Items.Remove(inmatningsrutan.Text); } }
private void svampväljaren_SelectedIndexChanged(object sender, System.EventArgs e) { valutskriften.Text = "Du har valt " + svampväljaren.SelectedItem; }
Händelsehanteraren för klick på knappen (tillknappen_Click):
svampväljaren.DataSource = svamparna; svampväljaren.DisplayMember = "Svampnamnet"; svampväljaren.ValueMember = "Svampnamnet";
class Svamp { private string namnet; public Svamp(string namn) { namnet = namn; } public string Svampnamnet { get { return namnet; } set { namnet = value; } } } // class Svamp
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
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"; } }
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"; } }
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; }
Föregående lektion | Lektionslista | Nästa lektion