Problema con ComboBox cargado desde una Matriz

102 views
Skip to first unread message

integral

unread,
Dec 16, 2025, 11:12:50 AM (7 days ago) Dec 16
to Comunidad de Visual Foxpro en Español
Que tal Amigos

Nuevamente tengo un problema con un control ComboBox. No muestra el Código del Banco seleccionado. A pesar que el valor existe.  
Aquí muestro el código que estoy utilizando.

ADDPROPERTY(Thisform,"idBanko","")                             
ADDPROPERTY(Thisform,"i",0)
 
LOCAL ARRAY Temp2Bank(1)
LOCAL i,lnTally, Pos

SELECT Codigo, Descrip, Vigente ;
    FROM Cur_Bancos ;
    INTO ARRAY Temp2Bank

lnTally = _Tally

WITH Thisform.CboCodi_Ban
    .Clear
    .BoundColumn = 1                                    && Devuelve el valor de la columna 1
    .ColumnCount = 2
    .ControlSource = 'Thisform.idBanko'
    .AddListItem("\]              ..::   Seleccione el Nombre del Banco   ::..         ",1,2)
    .AddListitem("",2,2)
    FOR i = 1 TO m.lnTally
        .AddListItem(Temp2Bank[m.i,1],m.i + 1,1)    && Codigo
        .AddListItem(Temp2Bank[m.i,2],m.i + 1,2)    && Descripcion
        .ListIndex = 1
    ENDFOR
    .Requery
    .Refresh
ENDWITH 

COMBOBOX_CON_TITULO.jpg
Agradezco sus comentarios y sugerencias

Saludos,

Integral

Martin Inga

unread,
Dec 16, 2025, 11:56:02 AM (7 days ago) Dec 16
to publice...@googlegroups.com

Estimado te comparto, mi código.

 

Img 1

 

 

 

Saludos

Martin Inga

Agradezco sus comentarios y sugerencias

 

Saludos,

 

Integral

 

--
Blog de la Comunidad Visual FoxPro en Español http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver este debate, visita https://groups.google.com/d/msgid/publicesvfoxpro/98ddc7c0-e4e3-477b-81ca-8b5e3bfcc0c1n%40googlegroups.com.

ZeRoberto

unread,
Dec 16, 2025, 4:31:32 PM (7 days ago) Dec 16
to publicesvfoxpro
Revisa Bound y BoundTo

Saludos 

Visual Foxpro
https://www.youtube.com/@vfpUnlimited

Grupo de Compra y Venta de Codigo Fuente en VFP

integral

unread,
Dec 17, 2025, 9:59:52 AM (6 days ago) Dec 17
to Comunidad de Visual Foxpro en Español
Que tal Amigos

Muy Buenos Días

Agradezco sus comentarios y Sugerencias.

El BoundTo es la solución cuando el campo es numérico.

El ejemplo del colega Martin tan solo le faltaría insertar un titulo. 

Voy a probar el siguiente código. que se parece en algo al ejemplo mostrado.

TEXT TO _sqltxt TEXTMERGE PRETEXT 7 NOSHOW
   SELECT
   Bancos.Codigo,
   Bancos.Descrip
   FROM dbo.Bancos
   INTO CURSOR Cur_Bancos
ENDTEXT

SQLEXEC(cn,_sqltxt,"CurBancos")

SELECT PADR("     ..:: Seleccione la Entidad Bancaria   ::..   ",50) AS Descrip ;
       FROM CurBancos ;
       WHERE RECNO() = 1 ;
       UNION ALL ;
       SELECT Codigo, Descrip ;
       FROM CurBancos ;
       INTO CURSOR Cur_Ban
 
SELECT Cur_Ban

COUNT TO _Found
IF _Found > 0
   ThisForm.CboCod_Ban.RowSource = "Cur_Ban"
   ThisForm.CboCod_Ban.RowSourceType = 2  
ENDIF

Atte.,
Integral

Elides Paredes

unread,
Dec 18, 2025, 7:02:43 PM (4 days ago) Dec 18
to Comunidad de Visual Foxpro en Español
Hice la misma pregunta a Gemini y respondió literalmente ésto: (Espero te sea útil amigo. Saludos)

Entiendo perfectamente el problema. En Visual FoxPro, el ComboBox puede ser un poco caprichoso cuando mezclas el llenado manual mediante AddListItem con la propiedad ControlSource, especialmente si el tipo de datos no coincide exactamente o si el índice se mueve durante el llenado.

El problema principal en tu código es que estás ejecutando .ListIndex = 1 dentro del ciclo FOR. Esto hace que en cada iteración el combo intente posicionarse, lo cual interfiere con la asignación del ControlSource. Además, al usar AddListItem, el orden de las columnas y el índice interno pueden confundirse si no se manejan con cuidado.

Aquí tienes una versión optimizada y corregida de tu código. He limpiado los caracteres invisibles y ajustado la lógica para que sea más robusta:

Fragmento de código
*-- Definir las propiedades si no existen (asegúrate de que idBanko sea del mismo tipo que 'Codigo') IF !PEMSTATUS(Thisform, "idBanko", 5) ADDPROPERTY(Thisform, "idBanko", "") ENDIF LOCAL ARRAY Temp2Bank(1) LOCAL i, lnTally *-- Seleccionamos los datos SELECT Codigo, Descrip ; FROM Cur_Bancos ; WHERE Vigente = .T. ; INTO ARRAY Temp2Bank lnTally = _TALLY WITH Thisform.CboCodi_Ban .LockScreen = .T. && Evita el parpadeo visual mientras carga .Clear .ColumnCount = 2 .ColumnWidths = "60,200" && Ajusta según necesites ver el código o no .BoundColumn = 1 .BoundTo = .T. && IMPORTANTE: Fuerza a VFP a buscar por el valor, no por el índice .ControlSource = "Thisform.idBanko" *-- Agregar el elemento inicial .AddListItem("Seleccione un Banco...", 1, 2) .AddListItem("00", 1, 1) && Un valor vacío o neutro para la columna bound *-- Llenar el resto de los datos IF lnTally > 0 FOR i = 1 TO lnTally *-- Usamos i + 1 porque el índice 1 ya lo ocupó el "Seleccione..." .AddListItem(TRANSFORM(Temp2Bank[m.i, 1]), m.i + 1, 1) && Código .AddListItem(Temp2Bank[m.i, 2], m.i + 1, 2) && Descripción ENDFOR ENDIF .ListIndex = 1 .LockScreen = .F. .Refresh ENDWITH
¿Qué corregimos y por qué?
  1. BoundTo = .T.: Este es el "secreto" más común en VFP. Si tu Codigo es numérico pero el ControlSource espera un carácter (o viceversa), el combo se pierde. BoundTo le dice a VFP que el valor del ControlSource debe coincidir con el valor contenido en la BoundColumn, no con el número de índice de la lista.

  2. ListIndex fuera del FOR: Moví la asignación del índice al final. Si lo dejas adentro, el combo intenta refrescarse mientras aún estás cargando datos, lo que puede causar que no muestre el valor seleccionado correctamente.

  3. Coherencia en AddListItem: Asegúrate de que Temp2Bank[m.i, 1] sea tratado como texto con TRANSFORM() si es necesario, ya que los métodos de lista prefieren strings para la visualización.

  4. LockScreen: Para una carga más limpia, especialmente si la tabla Cur_Bancos crece, esto evita que el usuario vea cómo se "mueve" el control mientras se llena.


Una recomendación adicional para tu sistema de talleres: Dado que estás manejando tablas de configuración (tarifas, bancos, etc.), podrías considerar usar el RowSourceType = 3 (SQL Statement) o 6 (Fields). Esto hace que el ComboBox se actualice automáticamente sin necesidad de hacer el FOR...ENDFOR, lo cual es más rápido y menos propenso a errores de caracteres invisibles.

¿Te gustaría que te muestre cómo configurar este mismo ComboBox usando RowSourceType = 3 para simplificar el código?

Reply all
Reply to author
Forward
0 new messages