valor validar vacio vacia una saber net esta espacios ejemplos como celda cambiar blanco .net winforms datagridview

.net - vacio - validar celda vacia excel c#



Clasificación de DataGridView con nulos en la columna DateTime (5)

Tengo un control DataGridView en una aplicación de formularios de Windows. Hay cuatro columnas con datos de cadena y tres con datos de fecha y hora. Estoy agregando las filas mediante programación utilizando el método Rows.Add (). Todas las columnas tienen SortMode establecido en Automático. Al hacer clic en los encabezados de las columnas para ordenar solo funciona, a excepción de la columna DateTime que tiene algunos nulos. Cuando el usuario hace clic en el encabezado de esa columna, arroja una ArgumentException: Object debe ser de tipo DateTime.

Conozco la manera difícil de evitar esto: configurar todos los SortModes en NotSortable, manejar el evento ColumnHeaderMouseClick y ordenar todo de forma manual. Estoy buscando la manera fácil.

¿Hay alguna propiedad o algo que pueda establecer, o alguna otra manera relativamente simple de permitir que esta columna ordene con nulos en ella?


Aquí está la solución que se me ocurrió. DataGridView genera un evento SortCompare que puede usar para ingresar una ordenación personalizada. Estoy manejando ese evento y haciendo que los valores nulos se clasifiquen más alto que los valores que no son nulos (también podría hacer que los valores nulos sean más bajos que los no nulos). Aquí está el código VB. Supongo que cada valor de celda es IComparable (si no, será manejado por la lógica normal de manejo de errores).

Try If e.CellValue1 Is Nothing OrElse e.CellValue1.Equals(DBNull.Value) Then If e.CellValue2 Is Nothing OrElse e.CellValue2.Equals(DBNull.Value) Then e.SortResult = 0 Else e.SortResult = 1 End If Else If e.CellValue2 Is Nothing OrElse e.CellValue2.Equals(DBNull.Value) Then e.SortResult = -1 Else e.SortResult = DirectCast(e.CellValue1, IComparable).CompareTo(DirectCast(e.CellValue2, IComparable)) End If End If e.Handled = True Catch ex As Exception HandleError("Error sorting result grid values", ex) Close() End Try

Si alguien tiene alguna mejora en esto, no dude en publicarlos.


Si agrega filas dinámicamente, debo asumir que DataGridView no tiene Databound. En este caso, ¿por qué no verifica los nulos cuando rellena las celdas de fila correspondientes y crea una especie de fecha ficticia (alguna fecha graciosa en el pasado para que quede claro que era nula? - tal vez también especifique que es un valor predeterminado) de modo que cuando se trata de clasificar, todo va bien.

Si esto no es bueno, ¿qué hay de crear su propia DataGridView exactamente igual que la incorporada (utilizando la herencia) PERO anulando el método de clasificación para ignorar los nulos?


Solo para agregar un código a esta pregunta ... Hice lo siguiente para que la ordenación funcione correctamente para DateTime (y otros tipos que no sean cadenas) en presencia de valores nulos:

public MyFormCTor() { ... m_dataGridView.SortCompare += MySortCompare; ... } ... static void MySortCompare(object sender, DataGridViewSortCompareEventArgs e) { if (e.CellValue1 == e.CellValue2) { e.SortResult = 0; return; } if (e.CellValue1 == null) { e.SortResult = -1; return; } if (e.CellValue2 == null) { e.SortResult = 1; return; } e.SortResult = ((IComparable)e.CellValue1).CompareTo(e.CellValue2); }


Una solución fácil es agregar una función "tonull", que ejecuta e.cellvalue1 y 2 cada vez que se realiza una comparación. Si el valor es "", el valor de la celda cambiará a 01/01/1001 si quiere que los valores nulos aparezcan primero en la ordenación o 01/01/3001 o algo ridículamente alto si quiere que aparezcan los últimos en el género

Private Sub dgvTable_SortCompare(ByVal sender As Object, ByVal e As DataGridViewSortCompareEventArgs) Handles dgvTable.SortCompare If e.Column.Index = 4 Then e.SortResult = System.DateTime.Compare(todatenull(e.CellValue1), todatenull(e.CellValue2)) End If e.Handled = True End Sub Function todatenull(ByVal cellvalue) If cellvalue = "" Then Return "01/01/1001" Else Return cellvalue End If End Function


Respuesta actualizada : Después de ver su respuesta publicada, veo que está buscando DBNull.Value en las celdas. Esa puede ser la fuente de su problema ya que DBNull.Value no se puede convertir a DateTime. Si está agregando las filas mediante programación, intente reemplazar DBNull.Value por nulo (Nothing).

Respuesta original : intente hacer esto para cada columna que contenga datos de DateTime, preferiblemente antes de cargar cualquier dato:

myDateTimeColumn.ValueType = GetType(DateTime)

Según MSDN , la propiedad ValueType se usa cuando se filtran o clasifican las columnas con respecto al contenido de sus celdas. Así que me aseguraré de configurarlo para cualquier columna que permita la clasificación.

Con este conjunto de propiedades, la cuadrícula se puede ordenar en una columna que tenga nulos y forzará que las celdas insertadas / actualizadas se conviertan a DateTime.