Entwickler-Ecke
WinForms - Datumsvergleich
coolace - So 10.08.08 21:17
Titel: Datumsvergleich
Hy,
ich hab ein kleines logick Problem und komm nicht drauf, folgendes ich habe eine Applikation
die vergleicht Geburtsdaten miteinander, die Daten bekommt er aus einer listbox im folgenden Format
(Datum+Leer+Name). Wer als nächstes Geburtstagstechnisch dran ist wird Namentlich in eine Textbox geschrieben.
Lösungsansatz: Ich trenn das Datum und den Namen in 2 separate Felder, das Datum in eine Datetimefeld und
den Namen in ein stringfeld. Soweit so gut, aber ich schaff es nicht das er das Datum erfolgreich mit
dem heutigen und dem nächsten vergleicht da der nächste Geburtstagskandidat ja älter als aktuelle Datum aber
jünger als der nächste ist.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| DateTime[] vergleich = new DateTime[lbox.Items.Count+1]; string[] gebname = new String[lbox.Items.Count]; DateTime[] heute = new DateTime[1]; heute[0] = Convert.ToDateTime(DateTime.Now.ToShortDateString()); int i=0; char t = ' '; foreach (string temp in lbox.Items) { gebspeicher = temp.Split(t); vergleich[i] = Convert.ToDateTime(gebspeicher[0]); gebname[i] = gebspeicher[1]; if (vergleich[i] >= heute[0]) { if (vergleich[i] <= vergleich[i + 1]) { txtgeburtstag.Text = gebname[i]; } } i++; } } |
LG
Coolace
Moderiert von
Christian S.: C#-Tags hinzugefügt
Christian S. - So 10.08.08 21:40
Vorweg: Du benutzt die Listbox zur Datenhaltung. Das ist falsch! Eine Listbox sollte immer nur dazu dienen, Daten anzuzeigen.
Du könntest z.B. so arbeiten (leider benutzt Du C# 2.0, mit 3.5 könnte man noch ein bisschen vereinfachen):
Erstmal eine Klasse für ein Geburtstagkind.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| public class Person {
private DateTime geburtstag; public DateTime Geburtstag { get { return geburtstag; } set { geburtstag = value; } }
private string name; public string Name { get { return name; } set { name= value; } }
public override string ToString() { return Geburtstag.ToString()+" "+Name; } } |
Jetzt eine Liste von Geburtstagskindern:
C#-Quelltext
1:
| List<Person> geburtstagskinder = new List<Person>(); |
Mit
Add kannst Du der Liste dann Personen hinzufügen:
C#-Quelltext
1: 2: 3: 4:
| Person christianS = new Person(); christianS.Name = "Christian S."; christianS.Geburtstag = new DateTime(1982, 4, 12); geburtstagskinder.Add(christianS); |
Und anzeigen dann mit:
C#-Quelltext
1:
| lbox.DataSource = geburtstagskinder; |
(Mit Binding-Listen und PropertyChangedNotification kann man noch mehr schicke Sachen machen, aber das geht erstmal zu weit ;-))
Dann kannst Du ganz bequem mit der Liste arbeiten (Vorsicht, aus dem Kopf getippt, sollte aber klappen!):
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| Person naechster = null; DateTime heute = DateTime.Now; if (geburtstagskinder.Count >= 1) naechster = geburtstagskinder[0];
if (geburtstagskinder.Count > 1) { for (int i = 1; i < geburtstagskinder.Count; i++) { DateTime compare = new DateTime(heute.Year, geburtstagskinder[i].Geburtstag.Month, geburtstagskinder[i].Geburtstag.Day); if ((compare.CompareTo(heute) >= 0) && (heute - compare) < (heute - naechster.Geburtstag) ) naechster = geburtstagskinder[i]. } } |
coolace - So 10.08.08 22:02
hy,
vielen Dank für die Antwort, bis jetzt ist es so das ich zur Eingabe in die Listbox ein Modalen Dialog hernehme und dann direkt eben diesen zusammengesetzten String an das Hauptformular die diese Listbox enthält übergebe. Gespeichert und ausgelesen wird dies aus einer .txt Datei. Mein Versuch bisher war eben beim Auslesen die Daten wie unten beschrieben zu trennen und zu vergleichen und den passenden Kandidaten zu ermitteln. Kann ich das auch realisieren ohne eine eigen Klasse daraus zu basteln ?
Gruß
Coolace
Christian S. - So 10.08.08 22:13
coolace hat folgendes geschrieben: |
| vielen Dank für die Antwort, bis jetzt ist es so das ich zur Eingabe in die Listbox ein Modalen Dialog hernehme und dann direkt eben diesen zusammengesetzten String an das Hauptformular die diese Listbox enthält übergebe. Gespeichert und ausgelesen wird dies aus einer .txt Datei. |
Das solltest Du wirklich ändern :mahn: ;-)
coolace hat folgendes geschrieben: |
| Kann ich das auch realisieren ohne eine eigen Klasse daraus zu basteln ? |
Das sollte recht einfach sein. Das Auslesen der DateTime-Werte scheint bei Dir ja nicht das Problem zu sein und wenn Du die einmal hast, kannst Du meinen letzten Sourcecode recht einfach anpassen.
//edit: Wieso ist "heute" bei Dir eigentlich ein Array? :gruebel:
coolace - Mo 11.08.08 08:12
dankeschön. Das mit dem Array hab ich gesehen und geändert, war irgendwie ein komischer Gedankengang.
Werd das entsprechend umbauen. Verwendetest du eigentlich für alles eine Klasse oder speicherst
du auch kleinere Sachen direkt in eine Listbox oder what ever man gerade braucht ?
Christian S. - Mo 11.08.08 11:22
coolace hat folgendes geschrieben: |
| Verwendetest du eigentlich für alles eine Klasse oder speicherst du auch kleinere Sachen direkt in eine Listbox oder what ever man gerade braucht ? |
Ich benutze immer irgendein Objekt (list, Dicitionary, etc.), welches die Daten hält und die listbox ist nur zur Anzeige da.
coolace - Di 12.08.08 08:12
vielen Dank, du hast mir auch schon für die Zukunft weitergeholfen sauberer zu programmieren und
dann auf solche Bastelaktionen verzichen zu können
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!