miércoles, 21 de abril de 2010

CONTROLAR DOS COMBOBOX O VARIOS COMBOBOX DENTRO DE UN DATAGRIDVIEW



Estimados lectores, ha sido una experiencia agradable el hacer este blog y tener algunos lectores que comparten el gusto por la programación; actualmente estoy empezando otro proyecto, muy personal,  con tecnología web  que espero compartir con toda la comunidad de programadores y necesito recursos porque es algo muy personal y mi situación financiera no es muy buena.

 Si alguien desearía apoyarme  tengo una tarjeta Oxxo Saldazo con el número:  4766-8408-7508-1593, cualquier apoyo lo pueden hacer en cualquier tienda Oxxo o en Banamex, les agradezco y que sus proyectos lleguen a buen fin.

www.artprogramnet.wordpress.com
Cuando tenemos dos o mas controles de tipo combobox en un datagridview, nos puede ocurrir que tengamos que ocupar el evento SelectedValueChanged del combo para realizar alguna acción, como puede ser: validar algo, colocar valores en otra columna etc,etc. OJO, pero resulta que si creamos un evento de tipo SelectedValueChanged (lo tenemos que crear manualmente, puesto que no existe este evento en un combobox dentro de un datagridview), lo que sucede es que cuando es mas de un combo en nuestro grid se dispara el mismo evento para TODOS los combos. La solución es saber el nombre del combo que necesita el evento. Supongamos que tenemos dos combobox en un grid, uno trae los articulos y otro el tipo de descuento para ese articulo. Cuando ocupamos el combo de articulos, necesitamos agregar ciertos valores al grid y cuando ocupamos el combo de tipo de descuento no necesitamos hacer nada, unicamente seleccionar. Por lo tanto creamos un evento para combo articulos. Para eso ocupamos el evento del grid EditingControlShowing de la manera siguiente.
‘Nuestro grid se llama dgdetalles
Private Sub Dgdetalles_EditingControlShowing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles dgdetalles.EditingControlShowing
‘validamos si el control que se esta editanos es un combo
If e.Control.GetType Is getType(DataGridViewComboBoxEditingControl) Then
‘obtenemos el nombre del combo en una variable para decidir si creamos el evento o no
Dim cNombreCbo As String = dgdetalles.Columns(Me.dgdetalles.CurrentCellAddress.X).Name
‘validamos que el nombre del combo sea el de articulos Nota:si fuera ‘el de combo de tipo de precio no necesito crear ningun evento
If cNombreCbo = "cboNombreArt" Then
‘asignamos el control que nos interesa a una variable, esta variable ‘debe estar declarada como private
m_comboBox = DirectCast(e.Control, ComboBox)
' Instalamos el controlador para el evento SelectedValueChanged
‘y lo direccionamos a ComboBoxOnSelectedValueChanged
AddHandler m_comboBox.SelectedValueChanged, _
AddressOf ComboBoxOnSelectedValueChanged
End If ‘fin de añadir evente
End If ‘fin de validar si el control es de tipo combobox
End Sub

‘aquí viene la rutina de lo que deseamos hacer para el combo de ‘articulos
Private Sub ComboBoxOnSelectedValueChanged( _
ByVal sender As Object, ByVal e As EventArgs)

' Referenciamos el control ComboBox que ha
' desencadenado el evento.
Dim cb As ComboBox = DirectCast(sender, ComboBox)
' Obtenemos el valor de su propiedad ValueMember
Dim valorseleccionado As Object = cb.SelectedValue
‘si deseamos ocupar el valor seleccionado, lo podemos poner en ‘el mismo grid o en cualquier otro lugar que se desee
‘en este caso particular lo coloco en otra columna llamada valor dgdetalles.Rows(dgdetalles.CurrentRow.Index).Cells("valor").Value = valorseleccionado.ToString
‘tambien grabo la orden de compra que se encuentra en una variable dgdetalles.Rows(dgdetalles.CurrentRow.Index).Cells("Orden").Value = sOrdCompra
End sub
‘en el rowvalidating eliminamos el evento creado '
Private Sub dgdetalles_RowValidating( _
ByVal sender As Object, _
ByVal e As DataGridViewCellCancelEventArgs) _
Handles dgdetalles.RowValidating
‘validamos que el m_combobox tenga algun valor para eliminar el evento
If m_comboBox IsNot Nothing Then
' Desinstalamos el controlador de eventos
RemoveHandler m_comboBox.SelectedValueChanged, _
AddressOf ComboBoxOnSelectedValueChanged
End If
End Sub
Si conocen alguna otra tecnica para resolver el manejo de varios combos en un datagridview, no duden en enviarmela para compartirla. Saludos

1 comentario:

  1. tendriasun ejemplo pero con filtracion de combox pero en forma horizontal

    ResponderEliminar