Autor Beitrag
coolace
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 141



BeitragVerfasst: So 10.08.08 21:17 
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.

ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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.
ausblenden 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:
ausblenden C#-Quelltext
1:
List<Person> geburtstagskinder = new List<Person>();					

Mit Add kannst Du der Liste dann Personen hinzufügen:
ausblenden 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:
ausblenden 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!):
ausblenden 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].
  }
}

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
coolace Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 141



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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:

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
coolace Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 141



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
coolace Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 141



BeitragVerfasst: 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