2009-02-20 26 views
7

Pracuję nad aplikacją rekordu nazwy, a informacje są przechowywane w bazie danych SQLite. Wszystkie kolumny w bazie danych są typu TEKST, z wyjątkiem kolumny daty urodzenia, która jest DATETIME. Oryginalna baza danych programu Access, którą przesłałem do bazy danych SQLite, zezwala na wartości null dla daty urodzenia, więc po skopiowaniu ustawiam wszystkie wartości null na DateTime.MinValue.Wymiana DateTime.MinValue w DataGridView

w mojej aplikacji, data urodzenia kolumnie jest sformatowany tak:

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

Moim problemem jest to, że wiersze tam, gdzie nie jest data urodzenia, baza danych ma DateTime.MinValue, który wyświetla w moim DataGridView jako 01/01/0001.

Szukam sposobu zastąpienia 01/01/0001 pusty ciąg ("") w moim DataGridView.

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 "" 
      } 
     } 
    } 

Ktoś ma pomysł, jak mogę zastąpić DateTime.MinValue w moim DataGridView z pustym ciągiem? Dzięki!

Edytuj: Przesyłanie wartości komórki za pomocą funkcji DateTime pozwala na wykonanie instrukcji if, ale nadal nie jestem w stanie znaleźć kodu, który zastąpiłby wartości MinValue pustym łańcuchem.

+0

Podobny Q & A zostały zamieszczone na tym stanowisku: http://stackoverflow.com/a/36492728/909689 –

Odpowiedz

5

Wystarczy rzucić go do DateTime

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

dodałem swoje zmiany do mojego kodu powyżej, i to pozwala mojej instrukcji if do pracy, ale nadal nie mogę wymyślić kod, aby faktycznie zmienić zawartość komórki. –

+0

W instrukcji if, gdzie wstawisz // ustaw wartość komórki na ""; Chyba musisz napisać ten kod resultsGrid.CurrentRow.Cells ["DateOfBirth"]. Value = "" Powinien to zrobić –

+0

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

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

można rzutować obiektu jako obiekt DateTime:

//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 "" 
    } 
} 

}

Albo może trzeba rzucić do DateTime, a następnie porównać do Min Wartość, ale wygląda na to, że masz dobry pomysł.

2

Chociaż może być całkiem proste, aby osiągnąć transformację, której potrzebujesz (zobacz doskonałe odpowiedzi poprzedzające moje), uważam, że najlepiej zastąpić wszystkie wartości DateTime.MinValue w tej konkretnej kolumnie w bazie danych za pomocą NULL. To poprawnie reprezentuje faktyczny brak danych na tym stanowisku. Obecnie baza danych zawiera dane niepoprawne dane i próbujesz postprocesować dane do wyświetlenia.

W związku z tym można obsługiwać wyświetlanie danych w GridView przy użyciu właściwości EmptyDataText lub NullDisplayText w celu zapewnienia odpowiedniego renderowania.

+0

Jestem zupełnie nowy do pracy z SQLite, więc mógłbym się mylić, ale pomyślałem, że DateTime nie może być puste. Jeśli to możliwe, byłoby to optymalne rozwiązanie, ponieważ masz rację - faktycznie wprowadziłem nieprawidłowe dane do mojej bazy danych. –

+0

Niestety, nie pracowałem z SQLite i wiem nawet mniej niż ty. Myślę jednak, że warto to zbadać. Zapoznaj się z dokumentacją. Ich strona mówi mi, że w SQLite 2 wszystko było beznadziejne. Dla SQLite3 - http://www.sqlite.org/datatype3.html – Cerebrus

0

Są już odpowiedzi, które powinny osiągnąć to, co chcesz; ale zastanawiam się, dlaczego nie umieszczasz NULL w bazie danych na początek? W sqlite3 "datetime" jest mniej więcej po prostu ciągiem znaków (nie ma nic szczególnego w kolumnie datetime, ponieważ sqlite3 dotyczy tylko typu afinity, a nie type binding), więc wstawiasz NULL w tej kolumnie. A w przypadku, gdy chcesz mieć MINVALUE DateTime podczas kwerendy, można łatwo wykonać zapytanie jak

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

odkryłem dlaczego DateTime.MinValue został wyświetlania!

Linia ta w sekcji formatowania komórek spowodował MINVALUE o „01/01/0001” na wyświetlaczu:

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

Bez tej linii, data urodzenia w polu moich datagridview jest pusta.

Barbaros Alp wciąż ma rację co do tego, co próbowałem zrobić w tym czasie. Dziękuję wszystkim!

2

Użyj nullabe Format DateTime zamiast DateTime ("DateTime?") - nie używaj napisów.

przykład:

public DateTime? mydate; 

, a następnie:

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