como cargar un combobox a una columna de un DataGrid en visual Basic 6.0

monijun
13 de Junio del 2006
tengo que cargar los datos que tengo en una tabla telefonosClientes en una grilla
la grilla tiene que tener los datos del cliente de la tabla clientes pero los telefonos no estan en la tabla clientes, solo estan asociados por el codigo cliente.
lo que quiero es que en la grilla cuando hago click en la columna telefonos se desplieguen todo los telefonos para caga cliente.
osea que en cada fila tengo los datos del cliente y en la columna telefono tengo los N telefonos como si el campo telefonos es un combo .
en las propiedades de la grilla existe el buton que lo marca como si fuera un combo pero no se como se usa. Gracias por responder


monijun
13 de Junio del 2006
aqui pongo un ejemplo despues de buscar mucho.
y como nadie me respondio supuse que puede ser de gran ayuda para muchos que estan como yo.
espero que les ayude.

primero hay que crear un data grid un combo, un dataList el ejemplo muestra las dos opciones
el combobox y comboList tienen que estar invisibles
Option Explicit

' explicación: este modelo sirve para editar dos campos de
' un dbGrid enlazado a un Data Control mediante un control
' de Lista y un control Combo

Dim ComboAbierto As Boolean
Dim ListaAbierta As Boolean
Dim AjusteAnchoCaja As Integer

' permite enviar mensajes tipo long a un control u objeto
Private Declare Function SendMessageLong Lib "user32" Alias _
"SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long

' despliega un combo automáticamente
Private Sub DespliegaCombo(ObjCombo As ComboBox)
Dim Resp As Long
Resp = SendMessageLong(ObjCombo.hwnd, &H14F, True, 0)
End Sub

Private Sub Combo1_Click()
' actualizar datos en el Data

' cerrar el combo
Combo1.Visible = False
ComboAbierto = False
End Sub

Private Sub Combo1_LostFocus()
' cerrar el combo
Combo1.Visible = False
ComboAbierto = False
End Sub

Private Sub DBGrid1_ButtonClick(ByVal ColIndex As Integer)
Select Case ColIndex
Case 0: ' desplegar la lista
' debajo de la celda (para ver lo el dato anterior)
' List1.Top = DBGrid1.Top + DBGrid1.RowTop(DBGrid1.Row) + DBGrid1.RowHeight

' despliega el combo encima de la celda
List1.Top = DBGrid1.Top + DBGrid1.RowTop(DBGrid1.Row)
List1.Left = DBGrid1.Columns(ColIndex).Left
List1.Width = DBGrid1.Columns(ColIndex).Width

' si se desea centrar más ojo al tipo de divisiones usadas
List1.Width = List1.Width + AjusteAnchoCaja

' visualizar la lista
List1.Visible = True
ListaAbierta = True
Case 1: ' desplegar el combo
' debajo de la celda (para ver lo el dato anterior)
' Combo1.Top = DBGrid1.Top + DBGrid1.RowTop(DBGrid1.Row) + DBGrid1.RowHeight

' despliega el combo encima de la celda
Combo1.Top = DBGrid1.Top + DBGrid1.RowTop(DBGrid1.Row)
Combo1.Left = DBGrid1.Columns(ColIndex).Left
Combo1.Width = DBGrid1.Columns(ColIndex).Width

' si se desea centrar más ojo al tipo de divisiones usadas
Combo1.Width = Combo1.Width + AjusteAnchoCaja

' si se desea poner el el .Text del combo el valor
' original del campo hacerlo aquí

Combo1.Visible = True

ComboAbierto = True

' desplegar el combo automáticamente
DespliegaCombo Combo1
End Select
End Sub

Private Sub DBGrid1_ColResize(ByVal ColIndex As Integer, Cancel As Integer)
' si está abierta la caja, cambiar el tamaño
' OJO, este evento provoca un falso Click
If ComboAbierto Then
Combo1.Top = DBGrid1.Top + DBGrid1.RowTop(DBGrid1.Row)
Combo1.Left = DBGrid1.Columns(1).Left
Combo1.Width = DBGrid1.Columns(1).Width

' si se desea centrar más ojo al tipo de divisiones usadas
Combo1.Width = Combo1.Width + AjusteAnchoCaja
End If

If ListaAbierta Then
List1.Top = DBGrid1.Top + DBGrid1.RowTop(DBGrid1.Row)
List1.Left = DBGrid1.Columns(0).Left
List1.Width = DBGrid1.Columns(0).Width

' si se desea centrar más ojo al tipo de divisiones usadas
List1.Width = List1.Width + AjusteAnchoCaja
End If
End Sub

Private Sub DBGrid1_RowColChange(LastRow As Variant, ByVal LastCol As Integer)
' si cambia de celda y hay lista o combo abierto, ocultarlos
If ComboAbierto Then
ComboAbierto = False
Combo1.Visible = False
End If

If ListaAbierta Then
ListaAbierta = False
List1.Visible = False
End If
End Sub

Private Sub DBGrid1_Scroll(Cancel As Integer)
' si intentamos hacer un scroll, no coincidirá el registro que se
' ve debajo con el valor a editar, por lo tanto impedimos el
' scroll
If ComboAbierto Or ListaAbierta Then
Cancel = True
End If
End Sub

Private Sub Form_Load()
' fijar un ancho cualquiera
DBGrid1.Columns(0).Width = 2000
DBGrid1.Columns(1).Width = 2000

' colocar botones en ambas columnas
DBGrid1.Columns(0).Button = True
DBGrid1.Columns(1).Button = True

' estos ajuste no son necesarios pero queda la caja mejor
' centrada y depende del tipo de divisiones que usemos en
' el dbGrid
AjusteAnchoCaja = 50
End Sub

Private Sub Form_Unload(Cancel As Integer)
Data1.Recordset.Close
End Sub

Private Sub List1_Click()
' actualizar datos en el Data Control

' cerrar la lista
List1.Visible = False
ListaAbierta = False
End Sub

Private Sub List1_LostFocus()
' cerrar la lista
List1.Visible = False
ListaAbierta = False
End Sub



monijun
13 de Junio del 2006
Aqui les mando para los que esten perdidos como yo
Option Explicit

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' explicación: este modelo sirve para editar dos campos de
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' un dbGrid enlazado a un Data Control mediante un control
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' de Lista y un control Combo

Dim ComboAbierto As Boolean
Dim ListaAbierta As Boolean
Dim AjusteAnchoCaja As Integer

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' permite enviar mensajes tipo long a un control u objeto
Private Declare Function SendMessageLong Lib \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"user32\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" Alias _
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"SendMessageA\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" (ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' despliega un combo automáticamente
Private Sub DespliegaCombo(ObjCombo As ComboBox)
Dim Resp As Long
Resp = SendMessageLong(ObjCombo.hwnd, &H14F, True, 0)
End Sub

Private Sub Combo1_Click()
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' actualizar datos en el Data

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' cerrar el combo
Combo1.Visible = False
ComboAbierto = False
End Sub

Private Sub Combo1_LostFocus()
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' cerrar el combo
Combo1.Visible = False
ComboAbierto = False
End Sub

Private Sub DBGrid1_ButtonClick(ByVal ColIndex As Integer)
Select Case ColIndex
Case 0: \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' desplegar la lista
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' debajo de la celda (para ver lo el dato anterior)
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' List1.Top = DBGrid1.Top + DBGrid1.RowTop(DBGrid1.Row) + DBGrid1.RowHeight

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' despliega el combo encima de la celda
List1.Top = DBGrid1.Top + DBGrid1.RowTop(DBGrid1.Row)
List1.Left = DBGrid1.Columns(ColIndex).Left
List1.Width = DBGrid1.Columns(ColIndex).Width

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' si se desea centrar más ojo al tipo de divisiones usadas
List1.Width = List1.Width + AjusteAnchoCaja

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' visualizar la lista
List1.Visible = True
ListaAbierta = True
Case 1: \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' desplegar el combo
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' debajo de la celda (para ver lo el dato anterior)
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' Combo1.Top = DBGrid1.Top + DBGrid1.RowTop(DBGrid1.Row) + DBGrid1.RowHeight

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' despliega el combo encima de la celda
Combo1.Top = DBGrid1.Top + DBGrid1.RowTop(DBGrid1.Row)
Combo1.Left = DBGrid1.Columns(ColIndex).Left
Combo1.Width = DBGrid1.Columns(ColIndex).Width

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' si se desea centrar más ojo al tipo de divisiones usadas
Combo1.Width = Combo1.Width + AjusteAnchoCaja

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' si se desea poner el el .Text del combo el valor
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' original del campo hacerlo aquí

Combo1.Visible = True

ComboAbierto = True

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' desplegar el combo automáticamente
DespliegaCombo Combo1
End Select
End Sub

Private Sub DBGrid1_ColResize(ByVal ColIndex As Integer, Cancel As Integer)
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' si está abierta la caja, cambiar el tamaño
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' OJO, este evento provoca un falso Click
If ComboAbierto Then
Combo1.Top = DBGrid1.Top + DBGrid1.RowTop(DBGrid1.Row)
Combo1.Left = DBGrid1.Columns(1).Left
Combo1.Width = DBGrid1.Columns(1).Width

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' si se desea centrar más ojo al tipo de divisiones usadas
Combo1.Width = Combo1.Width + AjusteAnchoCaja
End If

If ListaAbierta Then
List1.Top = DBGrid1.Top + DBGrid1.RowTop(DBGrid1.Row)
List1.Left = DBGrid1.Columns(0).Left
List1.Width = DBGrid1.Columns(0).Width

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' si se desea centrar más ojo al tipo de divisiones usadas
List1.Width = List1.Width + AjusteAnchoCaja
End If
End Sub

Private Sub DBGrid1_RowColChange(LastRow As Variant, ByVal LastCol As Integer)
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' si cambia de celda y hay lista o combo abierto, ocultarlos
If ComboAbierto Then
ComboAbierto = False
Combo1.Visible = False
End If

If ListaAbierta Then
ListaAbierta = False
List1.Visible = False
End If
End Sub

Private Sub DBGrid1_Scroll(Cancel As Integer)
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' si intentamos hacer un scroll, no coincidirá el registro que se
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ve debajo con el valor a editar, por lo tanto impedimos el
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' scroll
If ComboAbierto Or ListaAbierta Then
Cancel = True
End If
End Sub

Private Sub Form_Load()
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' fijar un ancho cualquiera
DBGrid1.Columns(0).Width = 2000
DBGrid1.Columns(1).Width = 2000

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' colocar botones en ambas columnas
DBGrid1.Columns(0).Button = True
DBGrid1.Columns(1).Button = True

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' estos ajuste no son necesarios pero queda la caja mejor
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' centrada y depende del tipo de divisiones que usemos en
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' el dbGrid
AjusteAnchoCaja = 50
End Sub

Private Sub Form_Unload(Cancel As Integer)
Data1.Recordset.Close
End Sub

Private Sub List1_Click()
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' actualizar datos en el Data Control

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' cerrar la lista
List1.Visible = False
ListaAbierta = False
End Sub

Private Sub List1_LostFocus()
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' cerrar la lista
List1.Visible = False
ListaAbierta = False
End Sub