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.
"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