Entwickler-Ecke

WinForms - Nach Datum in DataGridView suchen


edvazubi - Do 14.03.19 10:09
Titel: Nach Datum in DataGridView suchen
Guten Tag,

ich habe folgendes Problem:
In C# Windows Forms habe ich eine CSV Datei mit einigen Werten via Streamreader von einem DataGridView auslesen lassen. Das Programm soll eine Suchfunktion erhalten, mit der ich in dem DataGridView nach einem Datum suchen kann. Das Problem ist, meine Tabelle enthält jeweils nur das Datum des Montags als auch das Datum des Sonntags(In der aktuellen Woche der 11.03.2019 und der 17.03.2019). Wie schaffe ich es, ein Datum was zwischen den beiden Tagen liegt zu finden, wie z.B. den 13.03.2019? Das Datum muss nirgendwo angezeigt werden, es muss nur die richtige Zeile markiert werden.

Ich hoffe, ich bin hier richtig, danke schonmal im voraus.


Liebe Grüße,

edvazubi


erfahrener Neuling - Do 14.03.19 10:37

Hallo und :welcome:

ist doch eigentlich ganz simpel. Du musst nur prüfen, ob dein Datum zwischen dem Montags- und dem Sonntagsdatum liegt.
Also im Prinzip folgender Ablauf:


Quelltext
1:
2:
3:
4:
5:
6:
- Per Schleife jede Zeile des DataGridView durchlaufen
- Prüfen, ob eins der Daten (egal ob Sonntag oder Montag) das richtige Jahr und den richtigen Monat hat
  --> Wenn ja, dann:
  - Ist der Tag deines Suchdatums größer oder gleich des Montags?
  - Ist der Tag deines Suchdatums kleiner oder gleich des Sonntags?
    --> Wenn beide Bedindungen erfüllt sind, hast du die richtige Zeile gefunden und kannst diese z. B. Markieren, etc.


Als Hinweis: Jede Instanz des Typs DateTimes bringt die Eigenschaften Year, Month und Day mit.

Falls deine Daten (pl. Datum ;)) als String im DGV liegen, musst du die Werte beim Überprüfen vorher noch in ein DateTime umwandeln ("parsen")

Gruß

Julian


edvazubi - Do 14.03.19 10:54

Dankeschön, ich bin was Programmieren angeht ein Einsteiger und hab wenig Erfahrung mit C#, der Ablauf hört sich aber verständlich an. Ich werde mal mein Glück versuchen!


edvazubi - Fr 15.03.19 09:54

Ich bekomme es leider nicht hin, mein String in ein DateTime umzuwandeln. Könnte ich dafür noch einen Tipp bekommen? Meine Tabelle sieht im übrigen so aus:


erfahrener Neuling - Fr 15.03.19 09:57

Guck mal hier: DateTime.Parse [https://docs.microsoft.com/de-de/dotnet/api/system.datetime.parse?view=netframework-4.7.2#System_DateTime_Parse_System_String_]

Alternativ auch hier: Convert.ToDateTime [https://docs.microsoft.com/de-de/dotnet/api/system.convert.todatetime?view=netframework-4.7.2#System_Convert_ToDateTime_System_String_]

Moderiert von user profile iconTh69: URL-Titel hinzugefügt.


edvazubi - Fr 15.03.19 11:30

Mein Code sieht folgendermaßen aus:


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:
        public void searchweek()
        {
            DateTime searchValue = DateTime.now;

            dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            try
            {
                foreach (DataGridViewRow row in dataGridView1.Rows)
                {
                    if (row.Cells[0].Value.ToString().Equals(searchValue))
                    {
                        row.Selected = true;
                        break;
                    }
                }
            }
            catch (IOException ex)
            {
                if (ex.Source != null)
                    MessageBox.Show("IOException source:{0}", ex.Source);
                throw;

            }


Funktionieren für einen Montag würde das ganze, wenn ich als SearchValue einen String benutze. Ich verstehe noch nicht recht, wie ich meinen String jetzt innerhalb dieses Codes in ein DateTime Format bekomme. Da ich aber auch sehr begrenzte Programmierkenntnisse habe, da ich absoluter Anfänger bin, stehe ich gerade etwas auf dem Schlauch.

Das Prinzip dahinter habe ich verstanden, an der Umsetzung hapert es aber gerade


Ralf Jansen - Fr 15.03.19 11:41

Ist in deiner Zelle/ deinen Zellen im Grid jetzt ein DateTime oder ein string?


C#-Quelltext
1:
string searchValue = DateTime.now();                    


Wo hast du diese Methode her? Es gibt die DateTime.Now Property die liefert dir aber bereits einen DateTime und keinen string.

Sei dir bewußt das ein DateTime kein Datum ist sondern ein Zeitpunkt mit einer Auflösung in zehntausendstel Millisekunden. Das man 2 DateTimes die aus verschiedenen Quellen kommen per Equals vergleicht wird mit nahezu hundertprozentiger Wahrscheinlichkeit false liefern.

a.) Du wolltest doch irgendwas zwischen 2 Zeitpunkten finden und nicht was gleich einem Zeitpunkt ist?
b.) Du solltest dir überlegen was du wie vergleichen willst mit welcher Genauigkeit(Tages genau, Sekunden genau, Millisekunden genau und dann eventuell mit welcher Unschärfe)


edvazubi - Fr 15.03.19 11:51

Die Zeile habe ich bereits korrigiert. Hatte das ganze zunächst nur mit einem String ausprobiert und vergessen abzuändern.

Da ich Azubi mit wenig Erfahrung im Programmieren bin, habe ich zunächst versucht mir mit Code Schnipseln zu behelfen und für mich anzupassen. Dass ich das DateTime Format nicht mit einem String vergleich kann, ist mir bewusst. Von daher möchte ich wenn möglich innerhalb meiner Schleife meinen String der im DataGridView vorhanden ist in ein DateTime umwandeln und dann direkt vergleichen. Ist dies denn überhaupt möglich?

a) Wie gesagt, es ist nur zu Testzwecken ein String gewesen, daher hab ich den Vergleich mit "Equals" genutzt
b) Mir Reicht Tag, Monat und Jahr


Ralf Jansen - Fr 15.03.19 12:05

Ein DateTime hat eine Today Property dann bekommst du nur den Tag mit dem du sauber vergleichen kannst.

Du hast es immer noch nicht ganz deutlich gesagt aber ich vermute mal in deinem Grid sind in der Spalte DateTime Values und keine strings. Dann kannst du Value einfach auf DateTime casten.
Also etwa


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
DateTime searchDate = DateTime.Today;
DateTime firstDate = (DateTime)(row.Cells[0].Value);
DateTime secondDate = (DateTime)(row.Cells[1].Value);
  
if (searchDate >= firstDate && searchDate <= secondDate)
{
   // Treffer
}


erfahrener Neuling - Fr 15.03.19 12:06

user profile iconedvazubi hat folgendes geschrieben Zum zitierten Posting springen:
Mir Reicht Tag, Monat und Jahr

Dann guck dir mal die DateTime Klasse genauer an. Wie gesagt, die bringt die nötigen Eigenschaften schon mit sich

C#-Quelltext
1:
2:
3:
4:
Datetime searchDate = new DateTime(1989119); 
int day = searchDate.Day;
int month = searchDate.Month;
int year = searchDate.Year;


edvazubi - Fr 15.03.19 12:16

In meinem DataGridView sind leider Strings und kein DateTime. Von daher muss ich dies erst umwandeln. Wie ich das geschickt machen kann, verstehe ich allerdings zur Zeit noch nicht. Die Methode mit DateTime.today hört sich aber interessant an.


Ralf Jansen - Fr 15.03.19 12:26

DateTime hat eine Parse Methode bzw. ParseExact Methode um einen string in einen DateTime umzuwandeln. Bei Parse kannst du die Kultur (CultureInfo) mitgeben um zu sagen das Datum ist in z.b. deutschem Format. Bei ParseExact kannst du genauer das Format definieren (etwa dd-mm-yyyy oder sowas) wenn es nicht so einfach einer üblichen Datumsdarstellung in irgendeiner Kultur entspricht.

Beispiele zu Parse und ParseExact findest du in der Doku.