Discussion:
DataGridViewComboBoxColumn: Leer dato de .ValueMember
(demasiado antiguo para responder)
Ivan Pequeño
2009-12-26 12:37:01 UTC
Permalink
Si alguien pudiera darme una pista o un Link...

Mi problema es recuperar desde una celda de tipo ComboBox,
de un DataGridView, el valor y un código.
Si he logrado entender, cargo los datos siguientes de este modo:

'Cargar Tipos de Telecomunicaciones desde el P.Almacenado TlcTipoBrowser
_TlcTipoBrowserTA.Fill(_Gcp2k8DS.TlcTipoBrowser)

'Crea DataTable a partir de DataAdapter
Dim D As DataTable = _Gcp2k8DS.TlcTipoBrowser

'Define Propiedades de Enlace en Columna de tipo ComboBox de DataGridView
With DgvCbMedio
.DataSource = D
'Puede ser Teléfono de Domicilio, Sitio Web, E-Mail, etc
.DisplayMember = "Glosa"
'Es un ID autonumérico en la Tabla
.ValueMember = "ID_Tbl"
End With

1a Pregunta:
La Property .ValueMember ¿Estaría actuando como un ItemData de un Vb 6.0?
Si el propósito de .ValueMember NO ES ese agradecería me lo confirmaran y
continuaría trabajando (Como lo he hecho hasta ahora) con un HashTable
para encotrar los ID correspondientes a la Glosa.

Lo que estoy haciendo es intentar programar en Visual Basic .Net Version 8
y NO en Visual Basic 6.0 contenido en Vb 8.Net

If el Propósito de .ValueMember NO ES actuar como un ItemData de Vb 6.0 Then
No pierda su tiempo leyendo la continuación de este post
Return "NO, No entendistes NADA"

End if

2a Preguanta:
Estoy recuperando el .DisplayMember en el evento DataGridView_RowLeave,
pero constato que en éste el valor que obtengo de
Cstr(DataGridView(Col,Row).Value)
es la Option precedente y no la actual, es decir en este evento el cambio
aún no se
ha producido.
Me explico:
El Combo contenía la opción E-Mail y yo seleccioné Telefonía Móvil
el valor que contiene Cstr(DataGridView(Col,Row).Value) es E-Mail.
¿En que evento ya el cambio se produjo, para poder detectarlo?

3a Pregunta:
Una vez detectado el cambio, ¿Cómo hacer para recuperar el ID, es decir, el
código
de ese médio de Telecomunicación?
Lo mejor que he logrado recuperar desde .ValueMember es "ID_Tbl" y en ningún
caso el
Valor del ID. Sea Móvil = 5, Teléfono Oficina = 3, Etc...

Me he pasado varias horas en Internet, tratando de encontrar una solución,
algún ejemplo.
Hay miles de gentes exponiendo el problema, y no he logrado encontrar Ni una
sola solución.

Intente generar un evento para leer el estado de la Celda cuando esta pierde
el foco

'En Declaraciones
Private WithEvents CellComboBox As DataGridViewComboBoxEditingControl

'Y en el código:
Private Sub CellComboBox_LostFocus(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles CellComboBox.LostFocus

Dim T As String = CStr(TlcDgv(4, 0).Value)

End Sub

Pero algo tengo mal, puesto que el evento no se produce

¿Tendré que seguir con mi HashTable, que no es más que una transposicón de
Vb 6.0?

¿O tendré que resignarme a mi edad, que esto no es para mi?

¡SOCORRO!

y DE ANTE MANO GRACIAS A TODOS
SoftJaén
2009-12-26 16:01:46 UTC
Permalink
Post by Ivan Pequeño
Si alguien pudiera darme una pista o un Link...
Mi problema es recuperar desde una celda de tipo ComboBox,
de un DataGridView, el valor y un código.
Hola, Iván:

Suponiendo que la tercera columna de tu control DataGridView es del tipo
DataGridViewComboBoxColumn, la configurarías en tiempo de ejecución, por
ejemplo, en el evento Load del formulario, de la siguiente manera:

' Referenciamos la columna tipo DataGridViewComboBoxColumn
'
Dim column As DataGridViewComboBoxColumn = _
DirectCast(DataGridView1.Columns(2), DataGridViewComboBoxColumn)

' Configuramos la columna.
'
With column
' Origen de datos
'
.DataSource = objetoDataTable

' Nombre del campo cuyos datos se mostrarán en la columna
'
.DisplayMember = "Nombre_Cliente"

' Nombre del campo cuyo valor se devolverá cuando se
' seleccione un elemento.
'
.ValueMember = "Id_Cliente"
End With

Como puedes observar, en el control ComboBox subyacente se visualizarán los
nombres de los Clientes (propiedad DisplayMember), pero al seleccionar uno
de ellos nos devolverá su identificador (propiedad ValueMember).

Ahora, en el evento «EditingControlShowing» del control DataGridView, tienes
que detectar el control ComboBox subyacente existente en la celda:

Private Sub DataGridView1_EditingControlShowing( _
ByVal sender As Object, _
ByVal e As DataGridViewEditingControlShowingEventArgs) _
Handles DataGridView1.EditingControlShowing

' Ignoramos otros tipos de controles existentes en las celdas
'
If Not TypeOf e.Control Is _
DataGridViewComboBoxEditingControl Then Return

' Referenciamos el control TextBox subyacente en la celda actual.
'
Dim cellComboBox As DataGridViewComboBoxEditingControl = _
TryCast(e.Control, DataGridViewComboBoxEditingControl)

' Primero eliminamos el controlador para el evento
' SelectedValueChanged, y después lo volvemos a instalar.
'
RemoveHandler cellComboBox.SelectedValueChanged, _
AddressOf SelectedValueChanged

AddHandler cellComboBox.SelectedValueChanged, _
AddressOf SelectedValueChanged

End Sub

Construimos un procedimiento, con los mismos parámetros que el evento
«SelectecValueChanged» del control ComboBox, donde obtendremos el elemento
seleccionado en el control ComboBox subyacente:

Private Sub SelectedValueChanged( _
ByVal sender As Object, _
ByVal e As System.EventArgs)

' Referenciamos el control ComboBox
'
Dim combo As ComboBox = DirectCast(sender, ComboBox)

If combo.SelectedIndex <> -1 Then
' Leemos el valor de la propiedad SelectedValue
MessageBox.Show(CStr(combo.SelectedValue))
End If

End Sub

Cada vez que selecciones un elemento en el control ComboBox de la columna
tipo DataGridViewComboBoxColum, automáticamente se ejecutará el
procedimiento SelectedValueChanged, donde podrás obtener el valor de la
propiedad SelectedValue del control ComboBox subyacente, que en el ejemplo,
se corresponderá con el identificador del cliente seleccionado.

Si no controlas el evento «EditingControlShowing», no sabrás qué control
subyacente se aloja en una celda cualquiera del control DataGridView, en tu
caso, el control ComboBox. Una vez que detectes el control ComboBox, ya
estarías en condiciones de utilizarlo como si se tratara de un simple
control ComboBox cualquier que pudieres tener insertado en tu formulario.

De la manera explicada es cómo se trabaja con una columna tipo
DataGridViewComboBox. Adapta el ejemplo a tus necesidades y deja de comparar
los métodos y propiedades de VB 6.0 con los de Visual Basic .NET, porque de
seguir haciéndolo, «no vas a pillar el paso ni con un támbor». :-)
Post by Ivan Pequeño
Hay miles de gentes exponiendo el problema, y no he logrado
encontrar Ni una sola solución.
Esas miles de gentes seguro que no han leído las respuestas que yo he dado
sobre el asunto que nos ocupa. :-)

Un saludo y ¡Feliz Navidad!
--
Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.
Ivan Pequeño
2009-12-27 12:34:01 UTC
Permalink
Enrique,

Una vez más gracias por tu ayuda, acabo de leer el post y aún no lo he
implementado.

Pero te acuso recepción de inmediato, para manifestarte mi agradecimiento
por tu "Apertura de Puertas y horizontes".

Te deséo también Felices Navidades y un muy buen 2010, para ti y todos los
tuyos...

Me pongo a implementar esto ahora y pobre de tí si algo, no me funciona
porque no dudaré en ahullar, como ya lo he hecho tantas veces, lo que me ha
permitido seguir avanzando en esto, gracias a todos Ustedes
Ivan Pequeño
2009-12-27 13:07:02 UTC
Permalink
¡Aleluya!

Funciona Perfecto.

Me harás botar muchas líneas de código y peor aún me vas a hacer pasar un
año nuevo SONRIENDO.

Gracias nuevamente
b***@gmail.com
2017-10-03 16:58:58 UTC
Permalink
Tantos años y aparentemente aún es la mejor respuesta que se encuentra

Muchas gracias
Post by SoftJaén
Post by Ivan Pequeño
Si alguien pudiera darme una pista o un Link...
Mi problema es recuperar desde una celda de tipo ComboBox,
de un DataGridView, el valor y un código.
Suponiendo que la tercera columna de tu control DataGridView es del tipo
DataGridViewComboBoxColumn, la configurarías en tiempo de ejecución, por
' Referenciamos la columna tipo DataGridViewComboBoxColumn
'
Dim column As DataGridViewComboBoxColumn = _
DirectCast(DataGridView1.Columns(2), DataGridViewComboBoxColumn)
' Configuramos la columna.
'
With column
' Origen de datos
'
.DataSource = objetoDataTable
' Nombre del campo cuyos datos se mostrarán en la columna
'
.DisplayMember = "Nombre_Cliente"
' Nombre del campo cuyo valor se devolverá cuando se
' seleccione un elemento.
'
.ValueMember = "Id_Cliente"
End With
Como puedes observar, en el control ComboBox subyacente se visualizarán los
nombres de los Clientes (propiedad DisplayMember), pero al seleccionar uno
de ellos nos devolverá su identificador (propiedad ValueMember).
Ahora, en el evento «EditingControlShowing» del control DataGridView, tienes
Private Sub DataGridView1_EditingControlShowing( _
ByVal sender As Object, _
ByVal e As DataGridViewEditingControlShowingEventArgs) _
Handles DataGridView1.EditingControlShowing
' Ignoramos otros tipos de controles existentes en las celdas
'
If Not TypeOf e.Control Is _
DataGridViewComboBoxEditingControl Then Return
' Referenciamos el control TextBox subyacente en la celda actual.
'
Dim cellComboBox As DataGridViewComboBoxEditingControl = _
TryCast(e.Control, DataGridViewComboBoxEditingControl)
' Primero eliminamos el controlador para el evento
' SelectedValueChanged, y después lo volvemos a instalar.
'
RemoveHandler cellComboBox.SelectedValueChanged, _
AddressOf SelectedValueChanged
AddHandler cellComboBox.SelectedValueChanged, _
AddressOf SelectedValueChanged
End Sub
Construimos un procedimiento, con los mismos parámetros que el evento
«SelectecValueChanged» del control ComboBox, donde obtendremos el elemento
Private Sub SelectedValueChanged( _
ByVal sender As Object, _
ByVal e As System.EventArgs)
' Referenciamos el control ComboBox
'
Dim combo As ComboBox = DirectCast(sender, ComboBox)
If combo.SelectedIndex <> -1 Then
' Leemos el valor de la propiedad SelectedValue
MessageBox.Show(CStr(combo.SelectedValue))
End If
End Sub
Cada vez que selecciones un elemento en el control ComboBox de la columna
tipo DataGridViewComboBoxColum, automáticamente se ejecutará el
procedimiento SelectedValueChanged, donde podrás obtener el valor de la
propiedad SelectedValue del control ComboBox subyacente, que en el ejemplo,
se corresponderá con el identificador del cliente seleccionado.
Si no controlas el evento «EditingControlShowing», no sabrás qué control
subyacente se aloja en una celda cualquiera del control DataGridView, en tu
caso, el control ComboBox. Una vez que detectes el control ComboBox, ya
estarías en condiciones de utilizarlo como si se tratara de un simple
control ComboBox cualquier que pudieres tener insertado en tu formulario.
De la manera explicada es cómo se trabaja con una columna tipo
DataGridViewComboBox. Adapta el ejemplo a tus necesidades y deja de comparar
los métodos y propiedades de VB 6.0 con los de Visual Basic .NET, porque de
seguir haciéndolo, «no vas a pillar el paso ni con un támbor». :-)
Post by Ivan Pequeño
Hay miles de gentes exponiendo el problema, y no he logrado
encontrar Ni una sola solución.
Esas miles de gentes seguro que no han leído las respuestas que yo he dado
sobre el asunto que nos ocupa. :-)
Un saludo y ¡Feliz Navidad!
--
Enrique Martínez
[MS MVP - VB]
Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.
c***@gmail.com
2018-05-03 17:07:04 UTC
Permalink
Post by SoftJaén
Post by Ivan Pequeño
Si alguien pudiera darme una pista o un Link...
Mi problema es recuperar desde una celda de tipo ComboBox,
de un DataGridView, el valor y un código.
Suponiendo que la tercera columna de tu control DataGridView es del tipo
DataGridViewComboBoxColumn, la configurarías en tiempo de ejecución, por
' Referenciamos la columna tipo DataGridViewComboBoxColumn
'
Dim column As DataGridViewComboBoxColumn = _
DirectCast(DataGridView1.Columns(2), DataGridViewComboBoxColumn)
' Configuramos la columna.
'
With column
' Origen de datos
'
.DataSource = objetoDataTable
' Nombre del campo cuyos datos se mostrarán en la columna
'
.DisplayMember = "Nombre_Cliente"
' Nombre del campo cuyo valor se devolverá cuando se
' seleccione un elemento.
'
.ValueMember = "Id_Cliente"
End With
Como puedes observar, en el control ComboBox subyacente se visualizarán los
nombres de los Clientes (propiedad DisplayMember), pero al seleccionar uno
de ellos nos devolverá su identificador (propiedad ValueMember).
Ahora, en el evento «EditingControlShowing» del control DataGridView, tienes
Private Sub DataGridView1_EditingControlShowing( _
ByVal sender As Object, _
ByVal e As DataGridViewEditingControlShowingEventArgs) _
Handles DataGridView1.EditingControlShowing
' Ignoramos otros tipos de controles existentes en las celdas
'
If Not TypeOf e.Control Is _
DataGridViewComboBoxEditingControl Then Return
' Referenciamos el control TextBox subyacente en la celda actual.
'
Dim cellComboBox As DataGridViewComboBoxEditingControl = _
TryCast(e.Control, DataGridViewComboBoxEditingControl)
' Primero eliminamos el controlador para el evento
' SelectedValueChanged, y después lo volvemos a instalar.
'
RemoveHandler cellComboBox.SelectedValueChanged, _
AddressOf SelectedValueChanged
AddHandler cellComboBox.SelectedValueChanged, _
AddressOf SelectedValueChanged
End Sub
Construimos un procedimiento, con los mismos parámetros que el evento
«SelectecValueChanged» del control ComboBox, donde obtendremos el elemento
Private Sub SelectedValueChanged( _
ByVal sender As Object, _
ByVal e As System.EventArgs)
' Referenciamos el control ComboBox
'
Dim combo As ComboBox = DirectCast(sender, ComboBox)
If combo.SelectedIndex <> -1 Then
' Leemos el valor de la propiedad SelectedValue
MessageBox.Show(CStr(combo.SelectedValue))
End If
End Sub
Cada vez que selecciones un elemento en el control ComboBox de la columna
tipo DataGridViewComboBoxColum, automáticamente se ejecutará el
procedimiento SelectedValueChanged, donde podrás obtener el valor de la
propiedad SelectedValue del control ComboBox subyacente, que en el ejemplo,
se corresponderá con el identificador del cliente seleccionado.
Si no controlas el evento «EditingControlShowing», no sabrás qué control
subyacente se aloja en una celda cualquiera del control DataGridView, en tu
caso, el control ComboBox. Una vez que detectes el control ComboBox, ya
estarías en condiciones de utilizarlo como si se tratara de un simple
control ComboBox cualquier que pudieres tener insertado en tu formulario.
De la manera explicada es cómo se trabaja con una columna tipo
DataGridViewComboBox. Adapta el ejemplo a tus necesidades y deja de comparar
los métodos y propiedades de VB 6.0 con los de Visual Basic .NET, porque de
seguir haciéndolo, «no vas a pillar el paso ni con un támbor». :-)
Post by Ivan Pequeño
Hay miles de gentes exponiendo el problema, y no he logrado
encontrar Ni una sola solución.
Esas miles de gentes seguro que no han leído las respuestas que yo he dado
sobre el asunto que nos ocupa. :-)
Un saludo y ¡Feliz Navidad!
--
Enrique Martínez
[MS MVP - VB]
Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.
Muchas gracias!!! Me funciono perfecto!!!

b***@gmail.com
2015-08-01 02:47:38 UTC
Permalink
3
Loading...