Colorear dinamicamente celdas en un listbox

Buenas noches

Soy desarrollador de xojo con 1 ao de experiencia y es increible la herramienta pero ahora me surge una pregunta y quisiera pedir amablemente su ayuda.

Tengo un listbox que tiene celdas con los siguientes valores :

Puesto Valor 1 Valor 2 Valor 3


Puesto 1 1 2 3

Como puedo hacer para que dependiendo del valor se coloree la celda es decir si tiene valor 1 sea verde, si tiene valor 2 sea amarillo y si tiene valor 3 sea rojo.

Muchas gracias y en lo que pueda ayudar cuenten conmigo, tengo experiencia con valentina reports a sus ordenes.

Si a alguien le interesa puedo compartir sin costo un control listbox que compre que es bueno por lo que he podido investigar

Hola Jorge,

Para lo del color puedes mirar el ejemplo del evento CellBackgroundPaint de la documentacin: http://documentation.xojo.com/index.php/ListBox.CellBackgroundPaint

Si tienes alguna duda pregunta.

Un saludo,

Julen

Muchas gracias por tu respuesta

He seguido tu consejo pero como en otro ejemplo que hice me marca un error al ejecutar con ese simple codigo me marca un error.

En el evento open de la ventana tengo esto :

[i]Listbox1.AddRow( “Puesto : 1” , “SI”)
'Me.CellTag( 0,1 ) = “SI”

Listbox1.AddRow( “Puesto : 2” , “NO”)
'Me.CellTag( 1,1 ) = “NO”[/i]

En el evento CellBackGroundPaint tengo esto :

[i]If Me.CellTag( row , column ) = “SI” Then

g.ForeColor = &c00FF4000

' &cFFFFFF

g.FillRect(0, 0, g.Width, g.Height)

Else

g.ForeColor = &cFF000000

g.FillRect(0, 0, g.Width, g.Height)

End If[/i]

No corre y marca este error : OutOfBoundsException quedandose detenido en el metodo CellBackGroundPaint

No entiendo el por que de ese error siguiendo el ejemplo de la documentacion

Gracias por su invaluable ayuda

Hola Jorge,

Coloca el siguiente cdigo en el evento CellBackgroundPaint del ListBox:
---------------------------------------------------------------------->

//configura color de filas

If row Mod 2=0 then
g.foreColor= &cFF0000
else
g.foreColor= &cFFFFFF
end if
g.FillRect 0,0,g.width,g.height

---------------------------------------------------------------------->

Un saludo,

Elvis gracias por tu amable respuesta y funcional tal cual pero mas bien mi necesidad es que de acuerdo al contenido de la celda por ejemplo si es SI sea color verde el fondo y si es NO sea color rojo no se si me explique.

Gracias de nuevo

Hola Jorge,

Te sugiero utilizar como alternativa el RowPicture que te puede dar flexibilidad. En el ejemplo que ilustro, he creado dos imagenes con diferente color que simularan el target de la fila que se desea destacar. Este cdigo recorre la lista de datos, verifica contenido y clasifica la data para asignar el RowPicture.

---------------------------------------------------------------->

dim i as Integer
dim sData as String

for i=0 to self.lstData.ListCount-1

sData=self.lstData.Cell(i,0)

Select case sData
  
case "Data SI"
  
  self.lstData.RowPicture(i)=rowpic1
  
case "Data NO"
  
  self.lstData.RowPicture(i)=rowpic2
  
end Select

next i

---------------------------------------------------------------->

Funciona perfecto para asignar al renglon pero tengo el problema es que me lo piden que lo que cambie sea el color de la celda pero la evaluacion en el metodo CellBackGroundPaint no funciona marcando ese error

Gracias por tu seguimiento

Alguna otra idea ?

Gracias

Hola Jorge,

Otra idea puede ser que utilices el RowTag durante la carga de datos en el ListBox como fuente del mapeo del color de fila. Podra ser as:

1 Evento Open del ListBox

----------------------------------->

me.AddRow “Data SI”
me.CellTag(0,0)=&cFF0000

me.AddRow “Data NO”
me.CellTag(1,0)=&cFBBFFF

me.AddRow “Data NO”
me.CellTag(2,0)=&cFBBFFF

me.AddRow “Data SI”
me.CellTag(3,0)=&cFF0000

me.AddRow “Data SI”
me.CellTag(4,0)=&cFF0000

----------------------------------->

2 Evento CellBackgroundPaint del ListBox

-------------------------------------------------------------->
//Asigna color segn criterio
if row < me.ListCount and me.CellTag(row, column) <> Nil then
g.ForeColor = me.CellTag(row, column)
g.FillRect 0, 0, g.Width, g.Height
Return true
end if

-------------------------------------------------------------->

Hola Jorge

Hice este ejemplo según comprendí tu solicitud

Para conseguirlo, usé el evento “CellBackgroundPaint del ListBox”, como bien te mencionaron antes, pero condicionando el pintar o no la celda según la existencia de un valor ( < > = “”), y luego pintarlo en consecuencia de la columna en la que se encuentre. De cierta forma es un filtro.

Si es lo que necesitas aquí está el ejemplo que lo subí a Dropbox

Estoy atento a cualquier duda :slight_smile:

Perdn (< > “”), pero en el ejemplo queda ms claro.

Ah!! En el ejemplo de Javier est la clave (gracias Javier, yo tambin he aprendido de tu ejemplo). En el evento CellBackgroundPaint el cdigo empieza con

if row < me.ListCount then 

Se me hace curioso que esto sea necesario. Osea, el listbox pinta las celdas aunque no estn ah (o no tengan datos por ahora). Por una parte le veo la lgica, tiene que pintar esa parte del control de todas maneras, por otra me resulta extrao que nosotros tengamos que tenerlo en cuenta. Este era el problema del cdigo de Jorge.

Julen

Hola Julen

Creo que la obligatoriedad de hacer esa condicionante " if row < me.ListCount then ", responde a la naturaleza abierta y configurable que tiene el Listbox, por tanto, le ests indicando que su radio de accin para el evento pintar celdas, va a estar limitado hasta el nmero fsico de filas activas que en este caso son 4.

Aclarando tambin, que el 4 no queda fuera porque debemos recordar que para efectos internos las filas (row) comienzan desde 0, y aqu llegan a 3. Ayuda mucho poner puntos de interrupcin (BreakPoint) y ver que est pasando en las propiedades del Listbox.
:slight_smile:

Gracias Javier.

Estaba buscando algo as , gracias a todos ,especialmente a Javier por el ejemplo!