2009-02-20 7 views
7

Sto lavorando a un'applicazione di registrazione del nome e le informazioni sono archiviate in un database SQLite. Tutte le colonne nel database sono tipi di TESTO, ad eccezione della colonna Data di nascita, che è un DATETIME. Il database Access originale che ho trasferito al database SQLite ha permesso null per la data di nascita, quindi quando l'ho copiato, ho impostato tutti i null su DateTime.MinValue.Sostituzione di un DateTime.MinValue in un DataGridView

Nella mia applicazione, la data di nascita della colonna è formattato in questo modo:

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

Il mio problema è che le righe dove non c'è una data di nascita, il database è DateTime.MinValue, che mostra nel mio DataGridView come 01/01/0001.

Sto cercando un modo per sostituire 01/01/0001 con una stringa vuota ("") nel mio 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 "" 
      } 
     } 
    } 

Qualcuno ha un'idea di come posso sostituire un DateTime.MinValue nel mio DataGridView con una stringa vuota? Grazie!

Modifica: il cast del valore di cella con DateTime consente all'istruzione if di funzionare, ma non riesco ancora a capire la codifica per sostituire MinValues ​​con una stringa vuota.

+0

Q Simile & A sono state pubblicate su questo post: http://stackoverflow.com/a/36492728/909689 –

risposta

5

Hai solo bisogno di gettarlo ai DateTime

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

ho aggiunto la modifica al mio codice sopra, e permette che la mia istruzione if funzioni, ma non riesco ancora a capire il codice per modificare effettivamente il contenuto della cella. –

+0

Nell'istruzione if in cui viene inserito // Imposta il valore della cella su ""; Credo che sia necessario scrivere questo risultato di codiceGrid.CurrentRow.Cells ["DateOfBirth"]. Value = "" Dovrebbe farlo –

+0

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

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

si può lanciare l'oggetto come un oggetto 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 "" 
    } 
} 

}

o si potrebbe eseguire il cast in DateTime e quindi confrontare con Min Valore, ma sembra che tu abbia l'idea giusta.

2

Mentre potrebbe essere abbastanza semplice ottenere la trasformazione necessaria (vedere le risposte eccellenti che precedono la mia), ritengo che dovresti sostituire idealmente tutti i valori DateTime.MinValue in questa particolare colonna nel database con NULL. Questo rappresenterebbe correttamente l'effettiva mancanza di dati in questa posizione. Al momento il tuo database contiene dati errati e stai tentando di elaborare i dati per la visualizzazione.

Di conseguenza, sarà possibile gestire la visualizzazione dei dati nel GridView utilizzando le proprietà EmptyDataText o NullDisplayText per fornire un rendering appropriato.

+0

Sono nuovo di zecca lavorare con SQLite, quindi potrei sbagliarmi, ma ho pensato che un DateTime non poteva essere nullo. Se può, quella sarebbe la soluzione ottimale, perché hai ragione - in realtà ho inserito dati errati nel mio database. –

+0

Sfortunatamente, non ho lavorato con SQLite, e ne so ancora meno di quanto potresti. Tuttavia, penso che valga la pena indagare. Dai un'occhiata alla documentazione. Il loro sito mi dice che in SQLite 2, tutto era senza tipografia. Per SQLite3 - http://www.sqlite.org/datatype3.html – Cerebrus

0

Ci sono già risposte che dovrebbero raggiungere ciò che si desidera; ma mi chiedo perché non si inserisca NULL nel database per cominciare? In sqlite3, "datetime" è più o meno solo una stringa, (non c'è niente di speciale in una colonna datetime dato che sqlite3 si occupa solo di digitare afinity, non di tipo binding), quindi basta inserire NULL in quella colonna. E nel caso in cui si desidera avere la MinValue di datetime quando si esegue una query, si può facilmente eseguire una query come

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

ho scoperto il motivo per cui il DateTime.MinValue mostrava!

Questa linea nella sezione formattazione delle celle causato la MinValue di "01/01/0001" Per visualizzare:

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

Senza questa linea, il campo Data di nascita nella mia datagridview viene lasciato vuoto.

Barbaros Alp ha ancora ragione su quello che stavo cercando di fare in quel momento. Grazie a tutti!

2

Utilizzare il formato DateTime con valore nullo invece di DateTime ("DateTime?") - non utilizzare stringa.

esempio:

public DateTime? mydate; 

e poi:

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