Databinding
Børre Stenseth
Moduler>Databinding>Sonetter

Databinding

Hva
Image1
Databinding, navigasjon

Vi ønsker å la brukeren browse, eller inspisere, Shakespears sonetter. Det er 154 av dem og det er ikke hensiktsmessig å legge fram alle i en sammenhengenede liste.

Sonettene er beskrevet i modulen Noen datasett. Datagrunnlaget vi bruker her er en tekstfil, som ser slik ut:

<id>I
From fairest creatures we desire increase,
That thereby beauty's rose might never die,
But as the riper should by time decease,
His tender heir might bear his memory:
But thou, contracted to thine own bright eyes,
Feed'st thy light's flame with self-substantial fuel,
Making a famine where abundance lies,
Thyself thy foe, to thy sweet self too cruel.
Thou that art now the world's fresh ornament
And only herald to the gaudy spring,
Within thine own bud buriest thy content
And, tender churl, mak'st waste in niggarding.
Pity the world, or else this glutton be,
To eat the world's due, by the grave and thee.
<id>II
When forty winters shall besiege thy brow,
And dig deep trenches in thy beauty's field,
... osv

Vi legger denne datafile som en ressurs i programmet, og det første programmet vårt gjør er å plukke opp denne ressursen, hakke den opp i 154 sonetter og lage et Sonette-objekt for hver sonette. Sonette-klassen er svært enkel:

// just wrapping a sonnette
class Sonette : Object
{
    string t;
    public Sonette(string t)
    { this.t = t; }
    public string T { get { return t; } }
}

Mye av arbeidet i denne applikasjonen blir automatisert for oss i Visual Studio. Vi setter opp en kopling mellom et bindingSource-objekt og vår Sonette-klasse, ved å spesifisere properties i VS. Koden som blir generert er slik (bind1 er det namspaces som pakker inn alle filene i vår applikasjon):

 this.bindingSource1.DataSource = typeof(bind1.Sonette);

og vi får koplet til en eventhandler som kalles hver gang det skjer en endring i en av enhetene som skal vises:

this.bindingSource1.CurrentChanged +=
	new System.EventHandler(this.bindingSource1_CurrentChanged);

Det vi må gjøre i tillegg er å kople en bindingNavigator mot vår bindingSource. Dette er enkelt å gjøre i VS, men det gir opphav til ganske mye kode. Fleksibiliteten er ganske stor, og det har som alltid som konsekvens at spesifikasjonene blir mange. Selve koplingen settes opp slik:

this.bindingNavigator1.BindingSource = this.bindingSource1;

Nedefor finner du den koden som vi må håndkode, i tillegg til Sonnette-klassen som er vist ovenfor.

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        // get the text from resource: sonettene.txt
        String T=Properties.Resources.sonettene;
        // split int sonnettes            
        String[] slist = T.Split('<');
        for(int ix=0;ix<slist.Length;ix++)
            if (slist[ix].Length > 50)
                bindingSource1.Add(new Sonette(slist[ix].Substring(3)));
        // as we start
        bindingSource1.Position = 0;
        labelPoem.Text = ((Sonette)bindingSource1.Current).T;
    }
    
    private void bindingSource1_CurrentChanged(object sender, EventArgs e)
    {
        labelPoem.Text = ((Sonette)bindingSource1.Current).T;
    }
}

Vi ser at vi har ikke lagt inn noe logikk for foreta oss noe annet enn å browse.

Referanser
  • Prosjektet:
    https://svn.hiof.no/svn/psource/Csharpspikes/bindsonetter
Vedlikehold

B.Stenseth, desember 2005

(Velkommen) Moduler>Databinding>Sonetter (Enkel database)