2009-02-20 13 views
7

Estoy trabajando en una aplicación de registro de nombre y la información se almacena en una base de datos SQLite. Todas las columnas en la base de datos son tipos de TEXTO, excepto la columna de fecha de nacimiento, que es DATETIME. La base de datos de Access original que transferí a la base de datos de SQLite permitió nulos para la fecha de nacimiento, así que cuando lo copié, establecí todos los nulos en DateTime.MinValue.Reemplazando un DateTime.MinValue en un DataGridView

En mi solicitud, la fecha de nacimiento de la columna se formatea así:

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

Mi problema es que las filas donde no hay una fecha de nacimiento, la base de datos tiene DateTime.MinValue, que muestra en mi DataGridView como 01/01/0001.

Estoy buscando una manera de reemplazar el 01/01/0001 con una cadena vacía ("") en mi 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 "" 
      } 
     } 
    } 

Alguien tiene una idea de cómo puedo reemplazar un DateTime.MinValue en mi DataGridView con una cadena vacía? ¡Gracias!

Editar: Castear el valor de la celda con DateTime permite la instrucción if que tengo que trabajar, pero aún no puedo descubrir la codificación para reemplazar los MinValues ​​con una cadena en blanco.

+0

Q y A similares se han publicado en este mensaje: http://stackoverflow.com/a/36492728/909689 –

Respuesta

5

sólo tiene que echarlo a DateTime

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

que añade su cambio a mi código anterior, y permite que mi sentencia if funcione, pero todavía no puedo entender el código para realmente cambiar el contenido de la celda. –

+0

En la instrucción if donde pone // Establecer el valor de celda en ""; Supongo que necesita escribir este código resultsGrid.CurrentRow.Cells ["DateOfBirth"]. Value = "" Debería hacerlo –

+0

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

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

se puede convertir el objeto como un objeto 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 puede que tiene que convertir a DateTime y luego comparar con Min Valor, pero parece que tienes la idea correcta.

2

Si bien puede ser bastante sencillo lograr la transformación que necesita (vea las excelentes respuestas anteriores), creo que idealmente debería reemplazar todos los valores de DateTime.MinValue en esta columna particular en la base de datos con NULL. Esto representaría correctamente la falta real de datos en esta posición. En la actualidad, su base de datos contiene datos incorrectos y está intentando procesar los datos para su visualización.

En consecuencia, usted podría manejar la visualización de datos en su GridView usando las propiedades EmptyDataText o NullDisplayText para proporcionar una representación adecuada.

+0

Soy nuevo para trabajar con SQLite, así que podría estar equivocado, pero pensé que un DateTime no podía ser nulo. Si puede, esa sería la solución óptima, porque tiene razón: en realidad, he puesto datos incorrectos en mi base de datos. –

+0

Desafortunadamente, no he trabajado con SQLite, y sé incluso menos de lo que podría. Sin embargo, creo que vale la pena investigar. Eche un vistazo a la documentación. Su sitio me dice que en SQLite 2, todo era sin tipo. Para SQLite3 - http://www.sqlite.org/datatype3.html – Cerebrus

0

Ya hay respuestas que deberían lograr lo que desea; pero me pregunto por qué no pones NULL en la base de datos para empezar? En sqlite3, "datetime" es más o menos solo una cadena, (no hay nada especial acerca de una columna de fecha y hora, ya que sqlite3 solo trata de escribir afinidad, no escribir vinculante), por lo que solo debe insertar NULL en esa columna. Y en caso de que quiera tener la MinValue de fecha y hora cuando se consulta, se puede fácilmente ejecutar una consulta como

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

descubrí por qué el DateTime.MinValue estaba mostrando!

Esta línea en la sección formato de celda causó la MinValue de "01/01/0001" para mostrar:

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

Sin esta línea, el campo Fecha de nacimiento en mi datagridview se deja en blanco.

Barbaros Alp sigue teniendo razón acerca de lo que estaba tratando de hacer en ese momento. ¡Gracias a todos!

2

Utilice nullabe formato DateTime en lugar de DateTime ("DateTime?") - no use string.

ejemplo:

public DateTime? mydate; 

y luego:

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