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
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.
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.
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
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
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
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
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.
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.