24. april 2005 - 21:25Der 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 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 :)
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 :)
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;
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; }
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.
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); }
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 !
ahh glemte dig lige lidt godt at du fik det at funker
Synes godt om
Ny brugerNybegynder
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.