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 user profile iconChristian 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(1982412);
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//nächstes Geburtstagskind
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); //Geburtstag im aktuellen Jahr
    if ((compare.CompareTo(heute) >= 0/* nach dem heuigen Tag */ && (heute - compare) < (heute - naechster.Geburtstag) /*näher dran als der bisher "beste" */)
      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

user profile iconcoolace 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: ;-)

user profile iconcoolace 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

user profile iconcoolace 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