Este foro usa cookies
Este foro utiliza cookies para almacenar su información de inicio de sesión si está registrado y su última visita si no lo está. Las cookies son pequeños documentos de texto almacenados en su computadora; las cookies establecidas por este foro solo se pueden usar en este sitio web y no representan ningún riesgo de seguridad. Las cookies en este foro también rastrean los temas específicos que ha leído y la última vez que los leyó. Si Ud. continúa navegando, entenderemos que acepta todas las cookies.

Se almacenará una cookie en su navegador, independientemente de la elección, para evitar que se le vuelva a hacer esta pregunta. Podrá cambiar la configuración de sus cookies en cualquier momento utilizando el enlace en el pie de página.

Borrar este aviso
El foro antiguo se encuentra accesible desde https://foro.gambas-es.org en modo de solo lectura.

Calificación:
  • 1 voto(s) - 5 Media
  • 1
  • 2
  • 3
  • 4
  • 5

Limitar visualización de items ComboBox
#1

Buenas a todos,  tengo una consulta, en una casuística traigo de DB 20 registros y los presento en un combobox, se puede limitar la visualización a bloques de 4 por ejemplo.

se visualizan 4 y aparece barra lateral para ir bajando en bloques contiguos de 4 items.


Saludos
Responder
#2

Te pretendo ayudar pero no me queda claro lo que buscas. Te lo describo y tu me dices si lo he entendido.

1. Caja ComboBox
2. Clickamos en el botón con la flecha hacia abajo.
3. Se abre la lista hacia abajo.
4. Tu quieres que presente 4 items y cuando pasas estos items que pasen los siguientes 4 items y sustituyan los anteriores.

¿Es así?
Responder
#3

Entiendo tu pregunta pero no la propuesta que haces. Pero ahora te preguntaré yo: ¿por qué motivo sólo quieres mostrar de 4 en 4? Es porque el control combobox se despliega muy grande hacia abajo o es otro el motivo?

Saludos

Por favor, usa el corrector ortográfico antes de pulsar el botón 'Enviar'
Responder
#4

(27-07-2020, 14:10)jguardon escribió:  Entiendo tu pregunta pero no la propuesta que haces. Pero ahora te preguntaré yo: ¿por qué motivo sólo quieres mostrar de 4 en 4? Es porque el control combobox se despliega muy grande hacia abajo o es otro el motivo?

Saludos

Si, correcto el tema es visualmente que no se despliegue una monstruosidad de componente con tantas opciones.
que se visualicen 4 con un scroll y se pueda ir recorriendo.

Si fuese un componente programado en web pues asincronamente con el scroll se enviaría una petición limit offset a DB para limitar ese retorno.

Saludos

(27-07-2020, 14:09)gambafeliz escribió:  Te pretendo ayudar pero no me queda claro lo que buscas. Te lo describo y tu me dices si lo he entendido.

1. Caja ComboBox
2. Clickamos en el botón con la flecha hacia abajo.
3. Se abre la lista hacia abajo.
4. Tu quieres que presente 4 items y cuando pasas estos items que pasen los siguientes 4 items y sustituyan los anteriores.

¿Es así?

Si, es lo que por ejemplo haría un <select> en html, limitas los items que se visualizan, tu tienes 20, ves 4 y tienes un scroll lateral con el que vas bajando para ver los siguientes.

Saludos.
Responder
#5

La verdad es que lo único que se me ocurre es acceder al Parent y en el objeto (el control) que contiene el listado, cambiar la propiedad Height a un número de píxeles fijo que sea suficiente para ver 4 ítems como mucho. No creo que sea muy difícil, voy a mirar si puedo hacerlo.

También puedes crear un control heredado que tenga esa funcionalidad, por si lo vas a usar en más de un sitio.

Saludos

Por favor, usa el corrector ortográfico antes de pulsar el botón 'Enviar'
Responder
#6

Hola calcena

Me temo que habrá que fabricarse como un por ejemplo nuevo componente.

Ya, que no veo que tenga esta funcionalidad.

Saludos, joven.
Responder
#7

Ejecute este código en una nueva aplicación.

GAMBAS
  1. Timer1 As Timer
  2. Gridview1 As GridView
  3. Label1 As Label
  4. iCount As Integer
  5.  
  6. Public Sub Form_Open()
  7.  
  8.   Dim sData As String[] = Dir(User.home)
  9.   Dim iLoop As Integer
  10.  
  11.   Me.W = 275
  12.   Me.H = 200
  13.  
  14.   Timer1 = New Timer As "Timer1"
  15.  
  16.   With Gridview1 = New GridView(Me) As "Gridview1"
  17.     .X = 5
  18.     .Y = 50
  19.     .H = 25
  20.     .W = 250
  21.     .Grid = False
  22.     .Columns.Count = 1
  23.     .Rows.Count = 0
  24.     .Header = GridView.Horizontal
  25.     .ScrollBar = Scroll.Vertical
  26.     .Columns[0].Title = "ComboBox"
  27.  
  28.   For iLoop = 0 To sData.Max
  29.     Inc Gridview1.Rows.Count
  30.     Gridview1[iLoop, 0].Text = sData[iLoop]
  31.   Next
  32.  
  33.  
  34. Public Sub Gridview1_Enter()
  35.  
  36.   Timer1.Stop
  37.   Gridview1.Height = (Gridview1.Rows[0].Height * 4) + 25
  38.  
  39.  
  40. Public Sub Gridview1_Leave()
  41.  
  42.   Timer1.Start
  43.  
  44.  
  45. Public Sub Gridview1_Click()
  46.  
  47.   Gridview1.Columns[0].Title = Gridview1[Last.Row, 0].Text
  48.  
  49.  
  50. Public Sub Timer1_Timer()
  51.  
  52.   Gridview1.Height = 25
  53.   Timer1.Stop
  54.  


[Imagen: menu4.png]
Responder
#8

Sì, es un simpatico truco. Smile
Quizás... se puede eliminar el Objeto "Timer".

GAMBAS
  1. Gridview1 As GridView
  2.  
  3.     
  4. Public Sub Form_Open()
  5.      
  6.   Dim sData As String[] = Dir(User.home)
  7.   Dim iLoop As Integer
  8.      
  9.   Me.W = 275
  10.   Me.H = 200
  11.      
  12.   With GridView1 = New GridView(Me) As "Gridview1"
  13.     .X = 5
  14.     .Y = 50
  15.     .H = 25
  16.     .W = 250
  17.     .Grid = False
  18.     .Columns.Count = 1
  19.     .Rows.Count = sData.Count
  20.     .Header = GridView.Horizontal
  21.     .ScrollBar = Scroll.Vertical
  22.     .Columns[0].Title = "ComboBox"
  23.      
  24.   For iLoop = 0 To sData.Max
  25.     GridView1[iLoop, 0].Text = sData[iLoop]
  26.   Next
  27.      
  28.      
  29. Public Sub GridView1_Enter()
  30.      
  31.   GridView1.Height = Gridview1.Rows[0].Height * 4
  32.      
  33.      
  34. Public Sub GridView1_Leave()
  35.      
  36.   GridView1.Height = GridView1[Last.Row, 0].H
  37.  
  38.      
  39. Public Sub GridView1_Click()
  40.      
  41.   GridView1.Columns[0].Title = GridView1[Last.Row, 0].Text
  42.      


Responder
#9

Otra manera de hacerlo seria usando una sentencia SQL que incluya las palabras reservadas LIMIT y OFFSET
El método seria el siguiente:
Es necesaria una variable global integer
Luego cada vez que se hace click en el combobox y hay que rellenarlo con 4 registros
La consulta SQL, que tiene que ser algo como se muestra mas abajo, devolvera 4 registros o menos.
SQL
  1. SELECT * FROM contacts LIMIT 4 OFFSET 2;


Donde LIMIT es la cantidad máxima de registros devueltos y OFFSET el numero de bloque, es decir si hay 20 registros en tabla 20/4 = 5 (no recuerdo si arranca de 0 o de 1)
Una vez obtenidos los 4 registros se cargan en el combobox y listo.
Luego en cada evento click del combobox el numero de offset se incrementara 1 hasta el maximo y ahí vuelta a empezar.
El resultado es un combobox que siempre muestra 4 registros peero son diferentes cada vez.
Saludos.
Responder
#10

(29-07-2020, 19:18)vuott escribió:  Sì, es un simpatico truco. Smile
Quizás... se puede eliminar el Objeto "Timer".

GAMBAS
  1. Gridview1 As GridView
  2.  
  3.     
  4. Public Sub Form_Open()
  5.      
  6.   Dim sData As String[] = Dir(User.home)
  7.   Dim iLoop As Integer
  8.      
  9.   Me.W = 275
  10.   Me.H = 200
  11.      
  12.   With GridView1 = New GridView(Me) As "Gridview1"
  13.     .X = 5
  14.     .Y = 50
  15.     .H = 25
  16.     .W = 250
  17.     .Grid = False
  18.     .Columns.Count = 1
  19.     .Rows.Count = sData.Count
  20.     .Header = GridView.Horizontal
  21.     .ScrollBar = Scroll.Vertical
  22.     .Columns[0].Title = "ComboBox"
  23.      
  24.   For iLoop = 0 To sData.Max
  25.     GridView1[iLoop, 0].Text = sData[iLoop]
  26.   Next
  27.      
  28.      
  29. Public Sub GridView1_Enter()
  30.      
  31.   GridView1.Height = Gridview1.Rows[0].Height * 4
  32.      
  33.      
  34. Public Sub GridView1_Leave()
  35.      
  36.   GridView1.Height = GridView1[Last.Row, 0].H
  37.  
  38.      
  39. Public Sub GridView1_Click()
  40.      
  41.   GridView1.Columns[0].Title = GridView1[Last.Row, 0].Text
  42.      


Fantástico justo la solución que buscaba, muchas muchas gracias.

(29-07-2020, 19:58)tincho escribió:  Otra manera de hacerlo seria usando una sentencia SQL que incluya las palabras reservadas LIMIT y OFFSET
El método seria el siguiente:
Es necesaria una variable global integer
Luego cada vez que se hace click en el combobox y hay que rellenarlo con 4 registros
La consulta SQL, que tiene que ser algo como se muestra mas abajo, devolvera 4 registros o menos.
SQL
  1. SELECT * FROM contacts LIMIT 4 OFFSET 2;


Donde LIMIT es la cantidad máxima de registros devueltos y OFFSET el numero de bloque, es decir si hay 20 registros en tabla 20/4 = 5 (no recuerdo si arranca de 0 o de 1)
Una vez obtenidos los 4 registros se cargan en el combobox y listo.
Luego en cada evento click del combobox el numero de offset se incrementara 1 hasta el maximo y ahí vuelta a empezar.
El resultado es un combobox que siempre muestra 4 registros peero son diferentes cada vez.
Saludos.

Buenas esta que me comentas se me había pasado por la cabeza, como comento en mi post, porque en los componentes web es como funciona, por ejemplo los paginadores, se hace el cálculo se divide entre páginas y cada vez se hacen petición de post por página moviendo el limit y el offset.

Gracias lo tendremos en cuenta aunque creo que utilizaré la solución del compañero vuott.
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)