Avatar billede baitianlong Nybegynder
24. april 2005 - 21:25 Der er 15 kommentarer og
1 løsning

bøvl med objekt i forhold til tostring i listbox

Jeg er for sjov ved at lave en slags simpel kalender. Den består at disse elementer:

1) Kalenderform (hovedvinduet)
2) AftaleForm (aftalevindue, der åbner og lukker)
3) Klassen AftaleBog
4) Klassen Aftale

Når man skifter dato i kalenderen, skifter dagens aftaler i listboxen med denne metode:

private void monthCalendar1_DateChanged(object sender, System.Windows.Forms.DateRangeEventArgs e)
{
    dato = new DateTime(monthCalendar1.SelectionStart.Year, monthCalendar1.SelectionStart.Month, monthCalendar1.SelectionStart.Day);
    this.valgtdato.Text = dato.ToLongDateString();
    ListAftaler(dato);
}

...som det fremgår kalder den så ListAftaler =>

public void ListAftaler(DateTime dato)
{
    this.listA.Items.Clear();
    this.listA.Items.AddRange(abog.GetAftaler(dato));
}

...som så igen kalder GetAftaler (i AftaleBog'en) =>

public String[] GetAftaler(DateTime tid)
{
    ArrayList temp = new ArrayList();
    foreach(Aftale aftale in aftaler)
    {
        if(aftale.Tid.ToShortDateString().Equals(tid.ToShortDateString()))
            temp.Add(aftale.ToString());
    }
    string[] res = new string[temp.Count];
    temp.CopyTo(res);
    return res;
}

...Det er altsammen fint nok, men jeg vil så have at man kan dobbeltklikke på en aftale og så åbner den op i AftaleForm'en med indholdet fra aftalen listet, så man kan rette.

Og det er her det går galt, for jeg har jo ToStringen, men jeg skal bruge Aftale objektet, så jeg har rodet lidt med dette:

private void button3_Click(object sender, System.EventArgs e)
{
    char[] mellemrum = new char[1];
    mellemrum[0] = ' ';
    string[] tidarr1 = listA.SelectedItem.ToString().Split(mellemrum);
    string tid = tidarr1[0];
    char[] kolon = new char[1];
    kolon[0] = ':';
    string[] tidarr2 = tid.Split(kolon);
    int time = Convert.ToInt32(tidarr2[0]);
    int minut = Convert.ToInt32(tidarr2[1]);
    DateTime dato2 = new DateTime(dato.Year, dato.Month, dato.Day, time, minut, 00);
    AftaleForm a = new AftaleForm(abog, dato, true);
    a.Visible = true;
}

Som det fremgår prøver jeg at splitte min tostring op i underdele og sende denne dato til AftaleForm, så den i constructoren kan sige:

public AftaleForm(AftaleBog abog, DateTime dato, bool ret)
{
    this.abog = abog;
    this.dato = dato;
    InitializeComponent();
    if(ret)
        SetFields(abog, dato);
}

=>

public void SetFields(AftaleBog abog, DateTime dato)
{
    Aftale a = abog.GetAftaleFromDateTime(dato);
    this.boxTid.Text = a.Tid.ToShortTimeString();
    this.boxEmne.Text = a.Emne as string;
    this.boxDeltagere.Text = a.Deltagere;
    this.boxSted.Text = a.Sted;
}

...jeg er allerede der ude i noget snavs, for hvis man skal rette i Aftalen, bortfalder dens "kendemærke". Jeg skulle kunne behandle det på Objekt plan, så når jeg klikker på listboxen er det et Aftaleobjekt jeg sender til AftaleForm'en.

Det var noget af en lang forklaring, men jeg regner med at i dygtige C# mennesker kan se hvad jeg skal gøre ved det. PFT :)
Avatar billede baitianlong Nybegynder
24. april 2005 - 21:31 #1
For at prøve at koge det lidt ned (ved at sige noget mere - ha ha)

Det virker halvt nu idet, den viser de rette informationer i AftaleFormen. Problemet er at der ikke er noget Aftaleobjekt at opdatere properties på, og det derfor (formodentlig) bliver et nyt objekt, eller noget :)
Avatar billede baitianlong Nybegynder
24. april 2005 - 21:36 #2
Jeg har smidt programmet her, så er det nemmere at se problematikken:

http://www.legende.dk/diverse/Calendar.zip

Den opdaterer på DateChanged, så når der er lavet en aftale skal man lige klikke frem og tilbage i datoerne :)
Avatar billede lifo Nybegynder
24. april 2005 - 21:39 #3
nu er jeg ikke sikker og har heller ikke afprøvet det

hvad om du din GetAftaler returnerer en array af aftaler
i steden for en array af strings ?
bruger list boxen ikke allegevel din aftale's tostring metode
og så har du dine aftale objekter i value

public String[] GetAftaler(DateTime tid)
{
    ArrayList temp = new ArrayList();
    foreach(Aftale aftale in aftaler)
    {
        if(aftale.Tid.ToShortDateString().Equals(tid.ToShortDateString()))
            temp.Add(aftale);
    }
    return temp;
}

så skulle du kunne bruge
Aftale minAftale =  (Aftale)listA.SelectedItem;
Avatar billede baitianlong Nybegynder
24. april 2005 - 21:48 #4
Så er der (igen) nullpointer i denne linie:

this.listA.Items.AddRange(abog.GetAftaler(dato));

Jeg har skrevet:

public Aftale[] GetAftaler(DateTime tid)
{
    ArrayList temp = new ArrayList();
    foreach(Aftale aftale in aftaler)
    {
        if(aftale.Tid.ToShortDateString().Equals(tid.ToShortDateString()))
            temp.Add(aftale);
    }
    return temp.ToArray() as Aftale[];
}

...da jeg regnede med at det var det du mente :)
Avatar billede lifo Nybegynder
24. april 2005 - 22:15 #5
nej ikke helt det som jeg tænkte men næsten
public ArrayList GetAftaler(DateTime tid)
{
    ArrayList temp = new ArrayList();
    foreach(Aftale aftale in aftaler)
    {
        if(aftale.Tid.ToShortDateString().Equals(tid.ToShortDateString()))
            temp.Add(aftale);
    }
    return temp;
}
Avatar billede baitianlong Nybegynder
24. april 2005 - 22:20 #6
Jeg har dog fået den til at klappe i med nullpointer på dene måde:

public void ListAftaler(DateTime dato)
{
    this.listA.Items.Clear();
    Aftale[] dagensaftaler = abog.GetAftaler(dato);
    if(dagensaftaler != null)
    {
        for(int i = 0; i < dagensaftaler.Length; i++)
        {
            if(dagensaftaler[i] != null)
                this.listA.Items.Add(dagensaftaler[i]);
        }
    }
}

Jeg ved ikke lige om det er optimalt. Jeg er lige ved at teste, når man laver en ny aftale. For at se hvad der kommer i ListBoxen, når der er noget at vise.
Avatar billede baitianlong Nybegynder
24. april 2005 - 22:32 #7
Det kører ikke rigtig. Der kommer ikke noget i Listboxen

Det ser sådan ud nu:

public void ListAftaler(DateTime dato)
{
    this.listA.Items.Clear();
    Aftale[] dagensaftaler = abog.GetAftaler(dato);
    if(dagensaftaler != null)
    {
        for(int i = 0; i < dagensaftaler.Length; i++)
        {
            if(dagensaftaler[i] != null)
                this.listA.Items.Add(dagensaftaler[i].ToString());
        }
    }
}

-------------------

public Aftale[] GetAftaler(DateTime tid)
{
    ArrayList temp = new ArrayList();
    foreach(Aftale aftale in aftaler)
    {
        if(aftale.Tid.ToShortDateString().Equals(tid.ToShortDateString()))
            temp.Add(aftale);
    }
    return temp.ToArray() as Aftale[];
}

Hvad gør jeg. Jeg har hardkoded en aftale ind i AftaleBogens constructor:

private ArrayList aftaler;

    public AftaleBog()
    {
        aftaler = new ArrayList();
        Aftale a = new Aftale(new DateTime(2005,04,24,22,28,00), "emne", "Deltagere", "sted");
        aftaler.Add(a);
        }

Så den burde jo vises, men ak!
Avatar billede lifo Nybegynder
24. april 2005 - 22:32 #8
public void ListAftaler(DateTime dato)
{
this.listA.DataSource = null;
this.listA.DataSource = abog.GetAftaler(dato);
}

public ArrayList GetAftaler(DateTime tid)
{
    ArrayList temp = new ArrayList();
    foreach(Aftale aftale in aftaler)
    {
        if(aftale.Tid.ToShortDateString().Equals(tid.ToShortDateString()))
            temp.Add(aftale);
    }
    return temp;
}
Avatar billede lifo Nybegynder
24. april 2005 - 22:34 #9
og kun for smukheden
if(aftale.Tid.Day == tid.Day)
Avatar billede lifo Nybegynder
24. april 2005 - 22:41 #10
noget forfærdeligt vrøvl jeg siger om if(aftale.Tid.Day == tid.Day)
drop den
Avatar billede baitianlong Nybegynder
24. april 2005 - 22:43 #11
Ganske rørende, bortset fra at det ikke duer med bare day. Så sidste indlæg er ikke godt. Men der kommer noget i listen nu. Så er vi videre ved næste "lille" problem. Der kommer fejl, når man dobbeltklikker på en Aftale i listen, og man kan sågar ikke trykke New heller:

Den her bliver kaldt når man dobbeltklikker på en aftale

private void button3_Click(object sender, System.EventArgs e)
{
    AftaleForm a = new AftaleForm((Aftale) listA.SelectedItem);
    a.Visible = true;
}

Object reference not set to an instance of this object, siger den !
Avatar billede baitianlong Nybegynder
24. april 2005 - 22:46 #12
Constructoren med Aftale ser sådan her ud i AftaleForm:

public AftaleForm(Aftale aftale) //RET AFTALE
{
    denneaftale = aftale;
    dato = denneaftale.Tid;
    this.boxEmne.Text = denneaftale.Emne;
    this.boxDeltagere.Text = denneaftale.Deltagere;
    this.boxSted.Text = denneaftale.Sted;
    InitializeComponent();
}

Hvis det hjælper på overblikket :)
Avatar billede baitianlong Nybegynder
24. april 2005 - 22:52 #13
Jg tror det er samme problematik som jeg beskrev i starten.

listA.SelectedItem er ikke et Aftale object, og kan ikke castes til et. ?!

Der mangler ligesom en FromString() - hehe
Avatar billede baitianlong Nybegynder
24. april 2005 - 22:56 #14
Men hvis jeg beder den skrive:

Console.Write(listA.SelectedItem.GetType());

Får jeg Calendar.Aftale - Så det er jo en Aftale :S
Det er da underligt
Avatar billede baitianlong Nybegynder
24. april 2005 - 23:24 #15
Nu kører det hele :))

Det var en god ide at initializecomponent inden man tog dem i brug :)

Jeg takker for hjælpen (og koden blev sågar meget lettere), smid lige et svar.
Avatar billede lifo Nybegynder
24. april 2005 - 23:47 #16
ahh glemte dig lige lidt 
godt at du fik det at funker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester