2009-02-20 6 views
7

Je travaille sur une application d'enregistrement de nom et les informations sont stockées dans une base de données SQLite. Toutes les colonnes de la base de données sont des types TEXT, à l'exception de la colonne date de naissance, qui est DATETIME. La base de données Access d'origine que j'ai transférée à la base de données SQLite autorisait des valeurs nulles pour la date de naissance, donc quand je l'ai copié, j'ai mis tous les nulls à DateTime.MinValue.Remplacement d'un DateTime.MinValue dans un DataGridView

Dans ma demande, la date de la colonne de naissance est formaté comme ceci:

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

Mon problème est que les lignes où il n'y a pas une date de naissance, la base de données a DateTime.MinValue, qui affiche dans mon DataGridView au 01/01/0001.

Je cherche un moyen de remplacer le 01/01/0001 par une chaîne vide ("") dans mon 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 "" 
      } 
     } 
    } 

quelqu'un a une idée comment je peux remplacer un DateTime.MinValue dans mon DataGridView avec une chaîne vide? Merci! Editer: Lancer la valeur de la cellule avec DateTime permet à l'instruction if de fonctionner, mais je n'arrive toujours pas à trouver le code pour remplacer les MinValues ​​par une chaîne vide.

+0

Q & A similaires ont été publiés sur ce post: http://stackoverflow.com/a/36492728/909689 –

Répondre

5

Il vous suffit de le jeter aux DateTime

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

J'ajouté votre changement à mon code ci-dessus, et cela permet à mon instruction if de fonctionner, mais je n'arrive toujours pas à comprendre le code pour réellement changer le contenu de la cellule. –

+0

Dans l'instruction if où vous mettez // Définir la valeur de la cellule sur ""; Je suppose que vous devez écrire ce code resultsGrid.CurrentRow.Cells ["DateOfBirth"]. Value = "" Il devrait le faire –

+0

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

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

vous pouvez lancer l'objet comme objet 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 "" 
    } 
} 

}

Ou vous pourriez avoir à lancer à DateTime et ensuite comparer à Min Valeur, mais il semble que vous ayez la bonne idée.

2

Bien qu'il puisse être assez simple pour réaliser la transformation dont vous avez besoin (voir les excellentes réponses précédentes moi), je sens que vous devriez idéalement remplacer toutes les valeurs de DateTime.MinValue dans cette colonne particulière dans la base de données avec NULL. Cela représenterait correctement le manque réel de données dans cette position. Actuellement, votre base de données contient données incorrectes et vous essayez de traiter les données pour l'affichage. Par conséquent, vous seriez en mesure de gérer l'affichage des données dans votre GridView en utilisant les propriétés EmptyDataText ou NullDisplayText pour fournir un rendu approprié.

+0

Je suis tout nouveau à travailler avec SQLite, donc je peux me tromper, mais je pensais qu'un DateTime ne pouvait pas être nul. Si c'est possible, ce serait la solution optimale, parce que vous avez raison - j'ai effectivement mis des données incorrectes dans ma base de données. –

+0

Malheureusement, je n'ai pas travaillé avec SQLite, et je sais même moins que vous. Cependant, je pense que ça vaut la peine d'enquêter. Jetez un oeil à la documentation. Leur site me dit que dans SQLite 2, tout était sans typage. Pour SQLite3 - http://www.sqlite.org/datatype3.html – Cerebrus

0

Il existe déjà des réponses qui devraient atteindre ce que vous voulez; mais je me demande pourquoi vous ne mettez pas NULL dans la base de données pour commencer? Dans sqlite3, "datetime" est plus ou moins juste une chaîne, (il n'y a rien de spécial à propos d'une colonne datetime car sqlite3 est tout juste de type de définité, pas de liaison de type), donc vous insérez simplement NULL dans cette colonne. Et si vous voulez avoir le MinValue datetime lorsque vous interrogez, vous pouvez facilement exécuter une requête comme

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

j'ai découvert pourquoi le DateTime.MinValue déployait!

Cette ligne dans la section de mise en forme de cellule a causé la MinValue « 01/01/0001 » à afficher:

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

Sans cette ligne, la date de naissance de champ dans mon datagridview est vide. Barbaros Alp a toujours raison de ce que j'essayais de faire à ce moment-là. Merci tout le monde!

2

Utiliser le format DateTime nullabe au lieu de DateTime ("DateTime?") - n'utilisez pas de chaîne.

exemple:

public DateTime? mydate; 

puis:

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