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: .NET, combobox, datagridview, datagridviewcomboboxcolumn, visual basic
Enero 22nd, 2009 at 14:09
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...