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.