Quitar la selección de un ComboBox en un DataGridView en .NET.

Minipost recordatorio para mí mismo... Hace un rato he descubierto con gran sorpresa y desencanto que si en un objeto de tipo DataGridView tengo puestas algunas columnas como tipo ComboBox a través del objeto propio del .NET Framework DataGridViewComboBoxColumn (toma nombre cortito), y el campo en cuestión es de algún tipo que admite nulos -por ejemplo un Nullable(Of UInt16) o un simple String-... hasta que en el ComboBox no seleccionamos ningún valor, en la tabla relacionada de la base de datos se almacenará un valor NULL sin problemas, pero en el momento en que en el ComboBox seleccionamos un valor, no tenemos manera fácil de quitar esa selección. Dicho en plan fácil, un ComboBox dentro de un DataGridView nos permite seleccionar fácilmente un valor pero difícilmente quitar esa selección (aunque parezca mentira).

No obstante, si el campo es de tipo String no hay demasiado problema: nos podemos situar encima y con la combinación CTRL+0 (control cero) quitamos la selección. Ahora bien, el problema viene cuando el campo es numérico -como Nullable (Of UInt16)-. Aquí no podemos hacer un CTRL+0 sin más o nos lanzará un error.

Buscando buscando he encontrado un par de páginas (ésta y esta otra) que me han ayudado a resolver el problema y de paso a conocer que se trata de un bug reportado a Microsoft (sin que se hayan esmerado gran cosa en corregirlo, dicho sea de paso). En cualquier caso, la solución pasa por incorporar el siguiente código:

'----------------------------------------------------------------
' Event DGV.KeyDown.
'----------------------------------------------------------------
Private Sub DGV_KeyDown(ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyEventArgs) _
Handles DGV.KeyDown
    If TypeOf Me.DGV.Columns(Me.DGV.CurrentCell.ColumnIndex) _
    Is System.Windows.Forms.DataGridViewComboBoxColumn Then
        If e.KeyCode = Keys.D0 Or e.KeyCode = Keys.NumPad0 _
        Or e.KeyCode = Keys.Delete Then
            Me.DGV.CurrentCell.Value = System.DBNull.Value
            e.Handled = True
        End If
    End If
End Sub

De paso he incorporado la misma funcionalidad para la tecla Suprimir, que siempre es bastante más intuitivo para quitar la selección de un ComboBox que la combinación CTRL+0.

Tags: , , , ,

One Response to “Quitar la selección de un ComboBox en un DataGridView en .NET.”

  1. Luis Medel se atrevió a comentar:

    Pues mira, nunca me había encontrado con esto, pero lo incluyo en mi minicaja de herramientas para .NET

    Cada vez que trabajo con el admin de SQL Server me pregunro quién fue el lumbreras que decidió que se debía usar Ctrl+0 en vez de Suprimir para eliminar un campo...

Leave a Reply