Control Grid
Cuando vamos a configurar un grid y quiero pintar una celda en concreto o una columna entera, o una línea y que el pintarla o no, o el color vaya en función a un valor en concreto, debo aplicar una regla de color.
Para definir una regla de color, debo añadir a la grid de configuración la columna que voy a pintar. Además debo tener marcado el check de "Regla color" y a continuación pulsar el botón de regla de color. Éste me abre un código de ejemplo que tendré que manipular para obtener el resultado deseado.
La función (f) que debo programar, recibe los siguientes parámetros:
Valor de la celda
BackColor (a devolver)
ForeColor (a devolver)
Bookmark de la linea
El propio control grid
Dentro del propio scipt tenemos acceso a la conexión mediante el objeto gCn.
Código VB6:
Si quiero pintar una celda de la columna en función al valor que tiene la celda, en este caso es X.
'Modificar ejemplo. Borrar datos sobrantes Sub f(x,aBackColor,aForeColor,aBookMark, aGrid) '------------------------------------------------------------ ' x as Variant -- Valor de la celda ' aBackColor as Long -- BackColor a devolver ' aForeColor as Long -- ForeColor a devolver ' aBookMark as Variant -- Bookmark de la linea ' aGrid as TDBGrid -- El grid '------------------------------------------------------------ ' gCn as AhoraSistema.Conexion '------------------------------------------------------------ If CInt(X)>10 Then aBackColor = vbred aForeColor = vbYellow End If End Sub
Si la columna que quiero pintar depende de valores que están en otra celda, puedo hacer referencia al valor de la misma de ésta manera:
aGrid.Array.Value(CLng(aBookMark), CLng(aGrid.Columns("ColumnaAEvaluar").ColIndex))
'Modificar ejemplo. Borrar datos sobrantes Sub f(x,aBackColor,aForeColor,aBookMark, aGrid) '------------------------------------------------------------ ' x as Variant -- Valor de la celda ' aBackColor as Long -- BackColor a devolver ' aForeColor as Long -- ForeColor a devolver ' aBookMark as Variant -- Bookmark de la linea ' aGrid as TDBGrid -- El grid '------------------------------------------------------------ ' gCn as AhoraSistema.Conexion '------------------------------------------------------------ ' Si la columna a pintar no es la columna a consultar.. ' Pinto esta celda si el precio (dato en otra celda) es mayor que 100 lPrecio = aGrid.Array.Value(CLng(aBookMark), CLng(aGrid.Columns("Precio").ColIndex)) If CDbl(lPrecio)>100 Then aBackColor = vbWhite aForeColor = vbRed Else aBackColor = vbWhite aForeColor = vbBlack End If End Sub
Ejemplo:
Sub Initialize() gForm.Controls("grdPrecios").ActivarScripts = True End Sub Sub Grid_BeforeLoad(aGrid) If aGrid.Name = "grdPrecios" Then With aGrid .Grid.FetchRowStyle = True .Campo("Precio").ColorActivado = True .Campo("Precio").ReglaColor = "function f(x,aBackColor,aForeColor,aBookMark,aGrid) " _ & " If CLng(X) < 5 Then " _ & " aBackColor = RGB(255,127,80) " _ & " Else " _ & " aBackColor = vbWhite " _ & " End If " _ & "End function" End With End If End Sub
Para colorear toda la fila de la grid debemos de usar la propiedad FilaColor aquí pongo otro ejemplo:
Sub Initialize() gForm.Controls("grdLineas").ActivarScripts=True End Sub Sub Grid_BeforeLoad(aGrid) With agrid .Grid.FetchRowStyle = True .Campo("Cantidad").ColorActivado = True .Campo("Cantidad").FilaColor =True .Campo("Cantidad").ReglaColor = "function f(x,aBackColor,aForeColor,aBookMark,aGrid) " _ & " If CLng(X) > 4 Then " _ & " aBackColor = RGB(255,127,80) " _ & " Else If CLng(X) > 2 Then " _ & " aBackColor = vbRed " _ & " Else " _ & " aBackColor = vbWhite " _ & " End If End If " _ & "End function" End With refrescarGrids End Sub Sub refrescarGrids (aIdPedido) If IsEmpty (aIdPedido) Then aIdPedido = 0 End If gForm.Controls("grdLineas").where = "WHERE IdPedido = " & aIdPedido gForm.Controls("grdLineas").refrescar End Sub Sub Grid_AfterLoad(aGrid) Select Case agrid.Name Case "grdLineas" refrescarGrids gForm.Controls("EObjeto").ObjGlobal.Propiedades("IdPedido") End Select End Sub
Código C#:
En este ejemplo colorearemos el campo IdLinea de forma especial para la línea cuyo IdLinea sea 1, y el resto de otros colores también personalizados.
Primero nos aseguramos que está activo el check de la configuración "Activar Color".
Después creamos un script que tenga en cuenta el valor de IdLinea (x en la función) y devuelva los colores correspondientes.
Este sería el script que añadiremos en "Regla Color":
using AhoraCl; using AhoraCore; using AhoraOCX; using AhoraSistema; namespace AhoraScriptsPantalla { public partial class ScriptReglaColor: AhoraOCX.AhoraBaseScript { public void f(Valor x,Valor bookmark, ref System.Drawing.Color backColor, ref System.Drawing.Color foreColor, ICntGridUsuario grid) { //------------------------------------------------------------ // x as Valor -- Valor de la celda // backColor as System.Drawing.Color -- BackColor a devolver // foreColor as System.Drawing.Color -- BackColor a devolver // bookMark as Valor -- Bookmark de la linea // grid as ICntGridUsuario -- El grid //------------------------------------------------------------ // gCn as AhoraSistema.Conexion //------------------------------------------------------------ if (x > 1) { backColor = System.Drawing.Color.Blue; foreColor = System.Drawing.Color.Pink; } else { backColor = System.Drawing.Color.Red; foreColor = System.Drawing.Color.Yellow; } } } }
Nada más cerrar el formulario de edición veremos que los cambios se aplican inmediatamente en el grid:
Haremos referencia a otra columna de la siguiente forma:
grid.Array[bookmark, grid.Columns["NombreColumnaARecuperar"].ColIndex]
Adjuntamos un fichero de texto con la fórmula ejemplo para que puedan editarla y pegarla en el campo correspondiente para su comodidad. En esta fórmula tienen dos ejemplos; el simple, que afecta a la columna en cuestión sobre la que hemos aplicado "ReglaColor" y el que comprueba en otra columna (en este caso columna "Marca") un valor para devolver unos u otros valores.