2009-02-20 5 views
7

Ich arbeite an einer Anwendung namens Name Record und die Informationen werden in einer SQLite-Datenbank gespeichert. Alle Spalten in der Datenbank sind TEXT-Typen, mit Ausnahme der Geburtsdatumsspalte, bei der es sich um DATETIME handelt. Die ursprüngliche Access-Datenbank, die ich in die SQLite-Datenbank übertragen habe, erlaubte Nullen für das Geburtsdatum. Wenn ich sie also kopierte, setzte ich alle Nullen auf DateTime.MinValue.Ersetzen eines DateTime.MinValue in einer DataGridView

In meiner Anwendung wird das Geburtsdatum Spalte wie so formatiert:

DataGridViewTextBoxColumn dateOfBirth = new DataGridViewTextBoxColumn(); 
     dateOfBirth.HeaderText = "DOB"; 
     dateOfBirth.DataPropertyName = "DateOfBirth"; 
     dateOfBirth.Width = 75; 
     dateOfBirth.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; 
     dateOfBirth.DefaultCellStyle.Format = "MM/dd/yyyy"; 

Mein Problem ist, dass Zeilen, in denen es kein Geburtsdatum ist, die Datenbank hat DateTime.MinValue, die zeigt meine DataGridView als 01/01/0001.

Ich bin auf der Suche nach einer Möglichkeit, den 01.01.0001 durch eine leere Zeichenfolge ("") in meinem DataGridView zu ersetzen.

private void resultsGrid_DateFormatting(object sender, System.Windows.Forms.DataGridViewCellFormattingEventArgs e) 
    { 
     if(resultsGrid.Columns[e.ColumnIndex].Name.Equals("DateOfBirth")) 
     { 
      if ((DateTime)(resultsGrid.CurrentRow.Cells["DateOfBirth"].Value) == DateTime.MinValue) 
      { 
       // Set cell value to "" 
      } 
     } 
    } 

jemand eine Idee, wie ich einen DateTime.MinValue in meinem Datagridview mit einem leeren String ersetzen kann? Vielen Dank!

Edit: Casting der Zelle Wert mit DateTime ermöglicht die If-Anweisung Ich muss arbeiten, aber ich bin immer noch nicht in der Lage, herauszufinden, die Codierung die MinValues ​​durch eine leere Zeichenfolge zu ersetzen.

+0

ähnlich Q & A hat auf diesem Beitrag gepostet: http://stackoverflow.com/a/36492728/909689 –

Antwort

5

Sie müssen es nur Datetime werfen

if ((DateTime)(resultsGrid.CurrentRow.Cells["DateOfBirth"].Value) == DateTime.MinValue) 
      { 
       // Set cell value to "" 
      } 
+0

habe ich Ihre Änderung zu meinem Code oben, und es erlaubt meiner if-Anweisung zu arbeiten, aber ich kann immer noch nicht den Code, um den Inhalt der Zelle tatsächlich zu ändern. –

+0

In der if-Anweisung, wo Sie setzen // Setzen Sie den Zellenwert auf ""; Ich schätze, Sie müssen diesen Code schreiben resultGrid.CurrentRow.Cells ["DateOfBirth"]. Value = "" Es sollte es tun –

+0

resultsGrid.CurrentRow.Cells ["DateOfBirth"]. Value = "" –

0
if (yourDateOfBirth != null) 
{ 
    Convert.ToDate(yourDateOfBirth) == DateTime.MinValue 
} 
0

Sie das Objekt als Datetime-Objekt werfen kann:

//create a nullable intermediate variable 
System.DateTime? dtCellValue = resultsGrid.CurrentRow.Cells["DateOfBirth"].Value as System.DateTime?; 

//if this cell has been set to String.Emtpy the cast will fail 
//so ensure the intermediate variable isn't null 
if (dtCellValue.HasValue && dtCellValue == System.DateTime.MinValue) 
//set cell value appropriately 
0
private void resultsGrid_DateFormatting(object sender, System.Windows.Forms.DataGridViewCellFormattingEventArgs e) 
{ 
    if(resultsGrid.Columns[e.ColumnIndex].Name.Equals("DateOfBirth")) 
{ 
    if ((string)resultsGrid.CurrentRow.Cells["DateOfBirth"].Value == DateTime.MinValue.ToString()) 
    { 
     // Set cell value to "" 
    } 
} 

}

Oder Sie muss nach DateTime umwandeln und dann mit Min vergleichen Wert, aber es klingt wie du die richtige Idee hast.

2

Während es ziemlich einfach sein kann, die Transformation zu erreichen, die Sie benötigen (siehe die ausgezeichneten Antworten vor mir), sollten Sie idealerweise alle DateTime.MinValue-Werte in dieser bestimmten Spalte in der Datenbank durch NULL ersetzen. Dies würde den tatsächlichen Mangel an Daten in dieser Position korrekt darstellen. Derzeit enthält Ihre Datenbank falsche Daten und Sie versuchen, die Daten für die Anzeige nachbearbeiten.

Folglich könnten Sie die Anzeige von Daten in Ihrem GridView unter Verwendung der EmptyDataText oder NullDisplayText Eigenschaften behandeln, um entsprechendes Rendering bereitzustellen.

+0

Ich bin brandneu mit SQLite zu arbeiten, also könnte ich falsch liegen, aber ich dachte, dass eine DateTime nicht null sein könnte. Wenn es möglich ist, wäre das die optimale Lösung, weil Sie recht haben - ich habe tatsächlich falsche Daten in meine Datenbank eingegeben. –

+0

Leider habe ich nicht mit SQLite gearbeitet und weiß noch weniger als du. Ich denke jedoch, dass es eine Untersuchung wert ist. Schauen Sie sich die Dokumentation an. Ihre Site sagt mir, dass in SQLite 2 alles typlos war. Für SQLite3 - http://www.sqlite.org/datatype3.html – Cerebrus

0

Es gibt bereits Antworten, die erreichen sollten, was Sie wollen; aber ich frage mich, warum Sie nicht NULL in die Datenbank setzen, um damit zu beginnen? In sqlite3 ist "datetime" mehr oder weniger nur eine Zeichenkette (es gibt nichts Besonderes an einer datetime-Spalte, da es bei sqlite3 nur um affinity geht, nicht um type binding), also fügen Sie einfach NULL in diese Spalte ein. Und falls Sie die MinValue für Datum und Uhrzeit haben, wenn Sie fragen, können Sie leicht eine Abfrage wie ausführen

select coalesce(your_datetime_column,'01/01/0001') from your_table 
4

ich entdeckt, warum die DateTime.MinValue Anzeige wurde!

Diese Zeile in der Zellformatierung Abschnitt der MinValue von „01.01.0001“ anzuzeigen, verursacht:

dateOfBirth.DefaultCellStyle.Format = "MM/dd/yyyy"; 

Ohne diese Zeile das Geburtsdatum Feld in meinem datagridview leer gelassen.

Barbaros Alp ist immer noch richtig über das, was ich zu der Zeit zu tun versuchte. Danke allen!

2

Verwenden Sie das DateTime-Format anstelle von DateTime ("DateTime?") - verwenden Sie keine Zeichenfolge.

Beispiel:

public DateTime? mydate; 

und dann:

DGview.Rows.Add(mydate.HasValue ? mydate : null); 
Verwandte Themen