Grid - Todo lo que debes saber sobre este control

Creado por David Miralpeix, Modificado el Wed, 27 Mar 2024 a las 12:11 PM por Rosa Mª Martí

Sin duda, es el control más complejo de los controles personalizados.


Cuando definimos una grid lo hacemos indicando un origen de datos (vista, tabla o colección de objetos) y definiendo sus columnas.

Hay varias maneras de trabajar con este control, veremos unos cuantos ejemplos de cómo utilizarlo, pero antes, es importante tener en cuenta:

  • Utilizan una array de tipo XArrayDB para manejarse. Se puede referenciar mediante [NombreGrid].ArrayDB.
  • Si queremos utilizar el grid sólo como un Array, sin que los cambios se vean reflejados en tablas, debemos poner sus propiedades SoloArray = true y Refresca = false.
  • Si la propiedad Refresca = true el grid se refrescará siempre que se actualice un campo.
  • Si el grid permite insertar filas recuerde que puede controlar el valor de los campos a insertar mediante la propiedad Default del campo. Se utiliza frecuentemente para controlar la inserción de campos clave o campos incrementales.
  • Puede definir asistentes para los campos, de modo que al pulsar F3 en una celda con asistente le saldrá una pantalla de búsqueda.
  • Si la grid tiene la propiedad CargaObjeto=False, cuando actualizamos un registro significa que NO estamos actualizando el objeto. La grid no podrá contener los campos de la tabla configurables del objeto.
  • Si la grid tiene la propiedad CargaObjeto=True, cuando actualizamos un registro significa que estamos actualizando el objeto. Si el objeto tiene campos configurables (por lo tanto una tabla Conf_[Objeto]) y éstos se actualizarán si están reflejados en la grid.

Debido a la magnitud de este control, los ejemplos se desarrollan todos juntos al final de la sección, aunque cada propiedad o método muestre en una línea como usarlo.

 


GridUsuario


EditarPorObjeto


Descripción: Los datos son editados mediante objetos. La grid instancia el objeto y lo actualiza con los datos insertados y llama al método update del objeto. Con esta opción activada, permite guardar datos configurables del objeto. No se recomienda el uso de esta propiedad cuando la grid deba cargar un número elevado de registros, ya que ralentiza tanto la carga como el refresco de la grid.

Tipo: true/ false.


Código en VB6:

Sub Grid_BeforeLoad(aGrid)
   If agrid.name = "grdCopias" Then
     With gForm.Controls("grdCopias")
       .EditarPorObjeto = True
     End With
   End If
 End Sub 

Código en C#:

public void Grid_BeforeLoad(ICntGridUsuario aGrid)
{		
     if (aGrid.Name == "grdCopias") 
     {
         aGrid.EditarPorObjetoYVista = true;
     }
}



EditarPorObjetoyVista


Descripción: Si , tanto esta propiedad como la anterior, están a True, la lectura de los campos se hará de la vista que pone en el campo EdicionGrid de la tabla Objetos en el registro de la colección. Si no se ha configurado esta vista se leerá de la tabla o vista que especifique el código (From). No se recomienda el uso de esta propiedad cuando la grid deba cargar un número elevado de registros, ya que ralentiza tanto la carga como el refresco de la grid.

Tipo: true/false.


Código en VB6:

Sub Grid_BeforeLoad(aGrid)
   If agrid.name = "grdCopias" Then
     With gForm.Controls("grdCopias")
       .EditarPorObjeto = True
       .EditarPorObjetoyVista = True
     End With
   End If
 End Sub

Código en C#:

public void Grid_BeforeLoad(ICntGridUsuario aGrid)
{		
     if (aGrid.Name == "grdCopias") 
     {
         aGrid.EditarPorObjeto = true;
         aGrid.EditarPorObjetoYVista = true;
     }
}



MuestraCaption


Descripción: Indica si se mostrará o no el caption de la grid

Tipo: true/ false


Código en VB6:

 Sub Grid_BeforeLoad(aGrid)
   If agrid.name = "grdCopias" Then
     With gForm.Controls("grdCopias")
       .MuestraCaption = True
     End With
   End If
 End Sub 

Código en C#:

public void Grid_BeforeLoad(ICntGridUsuario aGrid)
{
	if (aGrid.Name == "grdCopias") 
	{
		aGrid.MuestraCaption = true;
	}
}


CaptionBase


Descripción: Es el texto que se mostrará sobre las columnas de la grid. Si no se especifica, mostrará el total de registros.  Si, por el contrario, se especifica y la propiedad ConcatenaCaption = true, se concatena al total de registros, por lo que deberemos dejar un espacio en blanco al final de la cadena.

Tipo: Cadena.


Código en VB6:

Sub Grid_BeforeLoad(aGrid)
   If agrid.name = "grdCopias" Then
     With gForm.Controls("grdCopias")
       .CaptionBase = "Copias realizadas "

     End With
   End If
 End Sub 

Código en C#:

public void Grid_BeforeLoad(ICntGridUsuario aGrid)
{
  if (aGrid.Name == "grdCopias") 
  {
    aGrid.ConcatenaCaption = true;
    aGrid.CaptionBase = "Copias realizadas: ";
  }
}



ConcatenaCaption


Descripción: Le añade al caption base el número de registros.

Tipo: true / false.


Código en VB6:

 Sub Grid_BeforeLoad(aGrid)
   If agrid.name = "grdCopias" Then
     With gForm.Controls("grdCopias")
       .ConcatenaCaption = True
     End With
   End If
 End Sub 

Código en C#:

public void Grid_BeforeLoad(ICntGridUsuario aGrid)
{
  if (aGrid.Name == "grdCopias") 
  {
    aGrid.ConcatenaCaption = true;
  }
}



Agregar


Descripción: Indica si la grid permite agregar registros.

Tipo: true / false.


Código en VB6:

 Sub Grid_BeforeLoad(aGrid)
   If agrid.name = "grdCopias" Then
     With gForm.Controls("grdCopias")
       .Agregar = True
     End With
   End If
 End Sub 

Código en C#:

public void Grid_BeforeLoad(ICntGridUsuario aGrid)
{
  if (aGrid.Name == "grdCopias") 
  {
    aGrid.Agregar = true;
  }
}


Editar


Descripción: Indica si la grid permite editar registros.

Tipo: true / false.


Código en VB6:

 Sub Grid_BeforeLoad(aGrid)
   If agrid.name = "grdCopias" Then
     With gForm.Controls("grdCopias")
       .Editar = True
     End With
   End If
 End Sub 

Código en C#:

public void Grid_BeforeLoad(ICntGridUsuario aGrid)
{
  if (aGrid.Name == "grdCopias") 
  {
    aGrid.Editar = true;
  }
}



Eliminar


Descripción: Indica si la grid permite eliminar registros.

Tipo: True / False.


Código en VB6:

 Sub Grid_BeforeLoad(aGrid)
   If agrid.name = "grdCopias" Then
     With gForm.Controls("grdCopias")
       .Eliminar = True
     End With
   End If
 End Sub 

Código en C#:

public void Grid_BeforeLoad(ICntGridUsuario aGrid)
{
  if (aGrid.Name == "grdCopias") 
  {
    aGrid.Eliminar = true;
  }
}



CargaObjetos


Descripción: Si CargaObjetos = True el origen de datos es las colección, si no, los datos se leen del FROM.

Tipo: True / False.


Código en VB6:

 Sub Grid_BeforeLoad(aGrid)
   If agrid.name = "grdCopias" Then
     With gForm.Controls("grdCopias")
       .CargaObjetos = True
     End With
   End If
 End Sub 

Código en C#:

public void Grid_BeforeLoad(ICntGridUsuario aGrid)
{
  if (aGrid.Name == "grdCopias") 
  {
    aGrid.CargaObjetos = true;
  }
}



Colección


Descripción: Le pasaremos la colección de objetos como origen de datos. Para esto necesitamos EditarPorObjeto = True.

Tipo: Colección


Código en VB6:

 Sub Grid_BeforeLoad(aGrid)
   If agrid.name = "grdCopias" Then
     With gForm.Controls("grdCopias")
       .EditarPorObjeto= True
       .Coleccion = "copias"
     End With
   End If
 End Sub 

Código en C#:

public void Grid_BeforeLoad(ICntGridUsuario aGrid)
{
  if (aGrid.Name == "grdCopias") 
  {
    aGrid.EditarPorObjeto = true;
    aGrid.Coleccion = gCn.Obj.DameColeccion("Copias", "");
  }
}



From


Descripción: Indica la tabla, vista o consulta que se utilizará como origen de datos. Intente siempre utilizar vistas o tablas directamente. Si desea emplear una consulta combinando tablas, debe especificar un Alias. Cuente con que el control hace un "SELECT columnas FROM XXX". Especifique sólo el origen de datos.

Tipo: String.


Código en VB6:

 Sub Grid_BeforeLoad(aGrid)
   If agrid.name = "grdCopias" Then
     With gForm.Controls("grdCopias")
       .From = "VPers_Copias"
     End With
   End If
 End Sub 

Código en C#:

public void Grid_BeforeLoad(ICntGridUsuario aGrid)
{
  if (aGrid.Name == "grdCopias") 
  {
    aGrid.From = "VPers_Copias";
  }
}



Alias


Descripción: Si especificamos un FROM de tipo consulta empleando tablas combinadas, ésta propiedad indicará a las columnas del grid el Alias de tabla por defecto.

Tipo: String. Ver ejemplo de grid usando alias.


Código en VB6:

 Sub Grid_BeforeLoad(aGrid)
   If agrid.name = "grdCopias" Then
     With gForm.Controls("grdCopias")
       .Alias = "VistaPers"
     End With
   End If
 End Sub 

Código en C#:

public void Grid_BeforeLoad(ICntGridUsuario aGrid)
{
  if (aGrid.Name == "grdCopias") 
  {
    aGrid.Alias = "VistaPers";
  }
}



FetchRowStyle


Descripción: Indica que cuando se refresque la grid, se activará el evento GridFetchRowStyle. Se utiliza generalmente cuando necesitamos pintar las filas del grid de acuerdo a algún valor dado.

Tipo: true/false.


Código en VB6:

 Sub Grid_BeforeLoad(aGrid)
   If agrid.name = "grdCopias" Then
     With gForm.Controls("grdCopias")
       .Grid.FetchRowStyle = True
     End With
   End If
 End Sub 'Para configurar las reglas de color, debe hacerse desde la configuración de la grid.

Código en C#:

public void Grid_BeforeLoad(ICntGridUsuario aGrid)
{
  if (aGrid.Name == "grdCopias") 
  {
    aGrid.FetchRowStyle = true;
  }
}



TablaObjeto


Descripción: Especifica la tabla en la que se van a guardar los datos del grid. Un grid puede tener un origen de datos distinto a la tabla donde se almacena. Guardará todos los datos que coincidan con los campos de la grid.

Tipo: String


Código en VB6:

 Sub Grid_BeforeLoad(aGrid)
   If agrid.name = "grdCopias" Then
     With gForm.Controls("grdCopias")
       .TablaObjeto = "Pers_Copias"
     End With
   End If
 End Sub 

Código en C#:

public void Grid_BeforeLoad(ICntGridUsuario aGrid)
{
  if (aGrid.Name == "grdCopias") 
  {
    aGrid.TablaObjeto = "Pers_Copias";
  }
}


Where


Descripción: Cláusula WHERE completa para filtrar el origen de datos.

Tipo: String


Código en VB6:

 Sub Grid_BeforeLoad(aGrid)
   If agrid.name = "grdCopias" Then
     With gForm.Controls("grdCopias")
       .Where = "WHERE liquidada=False "
     End With
   End If
 End Sub 

Código en C#:

public void Grid_BeforeLoad(ICntGridUsuario aGrid)
{
  if (aGrid.Name == "grdCopias") 
  {
    aGrid.Where = "WHERE Liquidada = False";
  }
}


OrdenMultiple


Descripción: Nombre de las columnas por las que queremos filtrar separadas por ",". Si se quiere en orden descendente añadir "DESC" tras la columna.

Tipo: String


Código en VB6:

 Sub Grid_BeforeLoad(aGrid)
   If agrid.name = "grdCopias" Then
     With gForm.Controls("grdCopias")
       .OrdenMultiple = "IdEmpleado, FechaAlta"
     End With
   End If
 End Sub 

Código en C#:

public void Grid_BeforeLoad(ICntGridUsuario aGrid)
{
  if (aGrid.Name == "grdCopias") 
  {
    aGrid.OrdenMultiple = "IdEmpleado, FechaAlta";
  }
}


Preparada


Descripción: Devuelve True cuando tiene columnas creadas. Se utiliza para saber si la grid ya ha sido inicializada.

Tipo: Boolean.


Código en VB6:

 Private Sub CargarLineas()
   On Error GoTo Error_    
   With gForm.Controls("grdCopias")
     If not Preparada then
        'Acciones a hacer la primera vez que se carga la grid     
     End If
   End With
 End Sub 

Código en C#:

public void Grid_BeforeLoad(ICntGridUsuario aGrid)
{
  if (aGrid.Name == "grdCopias") 
  {
    if (!aGrid.Preparada) 
    {
      // Acciones a hacer la primera vez que se carga la grid    
    }
  }
}

SoloArray


Descripción: Si el valor es True especifica que queremos trabajar sin que el grid actualice los datos en la tabla.

Tipo: Boolean.


Código en VB6:

 Sub Grid_BeforeLoad(aGrid)
   If agrid.name = "grdCopias" Then
     With gForm.Controls("grdCopias")
       .SoloArray = True
     End With
   End If
 End Sub 

Código en C#:

public void Grid_BeforeLoad(ICntGridUsuario aGrid)
{
  if (aGrid.Name == "grdCopias") 
  {
    aGrid.SoloArray = true;
  }
}



Refresca


Descripción: Si el valor es True especifica que se refresque el grid cada vez que se inserte, modifique o elimine un registro.

Tipo: Boolean.


Código en VB6:

 Sub Grid_BeforeLoad(aGrid)
   If agrid.name = "grdCopias" Then
     With gForm.Controls("grdCopias")
       .Refresca = True
     End With
   End If
 End Sub 

Código en C#:

public void Grid_BeforeLoad(ICntGridUsuario aGrid)
{
  if (aGrid.Name == "grdCopias") 
  {
    aGrid.Refresca = true;
  }
}


NoUsarIdDocs


Descripción: Cuando utilizamos un origen de datos que carece del campo IdDoc pondremos ésta propiedad a True para que no dé error al actualizar, ya que el control necesita de un campo Identidad para realizar las actualizaciones. Use esta propiedad cuando quiera una grid en casos especiales de sólo consulta o sólo array.

Tipo: Boolean.


Código en VB6:

 Sub Grid_BeforeLoad(aGrid)
   If agrid.name = "grdCopias" Then
     With gForm.Controls("grdCopias")
       .NoUsarIdDocs = True
     End With
   End If
 End Sub 

Código en C#:

public void Grid_BeforeLoad(ICntGridUsuario aGrid)
{
  if (aGrid.Name == "grdCopias") 
  {
    aGrid.NoUsarIdDocs = true;
  }
}



ColumnaEscalada


Descripción: Establece la columna que debe crecer al maximizar el grid.

Tipo: String.


Código en VB6:

 Sub Grid_BeforeLoad(aGrid)
   If agrid.name = "grdCopias" Then
     With gForm.Controls("grdCopias")
       .ColumnaEscalada = "Descrip"
     End With
   End If
 End Sub 

Código en C#:

public void Grid_BeforeLoad(ICntGridUsuario aGrid)
{
  if (aGrid.Name == "grdCopias") 
  {
    aGrid.ColumnaEscalada = "Descrip";
  }
}



ArrayDB


Descripción: Array en el que se basa la grid.

Tipo: XArrayDB.


Código en VB6:

 Sub ejArrayDB 
    Set lArray = gform.Controls("grdCopias").ArrayDb 
    For i = lArray.LowerBound(1) To lArray.UpperBound(1)  
        MsgBox lArray(i, 1) 
    Next 
End Sub 

Código en C#:

private void EjArrayDB()
{
  IXArrayDB lArray = (gForm.Controls["grdCopias"] as ICntGridUsuario).ArrayDb;
  for (int i = lArray.LowerBound(1); i <= lArray.UpperBound(1); i++)
  {
    AhoraCore.VBA.Interaction.MsgBox(lArray[i, 1].ToString());
  }
}



ArrayValue (fila,columna)


Descripción: Devuelve o establece un valor dentro del array del grid, donde la fila es un Long y la columna String. En C# esta propiedad se ha convertido en la propiedad por defecto de ICntGridUsuario lo que nos ha permitido indizarla directamente. En el ejemplo adjunto pueden ver como se usa en este lenguaje.

Tipo: Valor.


Código en VB6:

 Private Sub SumarTotal()
   With grdCopias
     For i = 0 To .Grid.ApproxCount - 1
       lTotal = lTotal + .ArrayValue(i, "Total")
   End With
 End Sub 

Código en C#:

private int SumarTotal()
{
  int lTotal = 0;
  ICntGridUsuario grdCopias = (gForm.Controls["grdCopias"] as ICntGridUsuario);
  if (grdCopias != null)
  {
    for (int i = 0; i < grdCopias.ApproxCount -1; i++)
    {
      lTotal = lTotal + CInt(grdCopias[i, "Total"]);
    }
  }
  return lTotal;
}



SQLSelect


Descripción: Instrucción SQL completa que toma el grid como origen de datos. Es la unión final de todas las instrucciones dadas (Columnas, FROM, WHERE, UNION)

Tipo: String.


Código en VB6:

 Sub MostrarSelect()
   MsgBox gform.Controls("grdCopias").SQLSelect
 EndSub 

Código en C#:

private void MostrarSelect()
{
  ICntGridUsuario grdCopias = (gForm.Controls["grdCopias"] as ICntGridUsuario);
  AhoraCore.VBA.Interaction.MsgBox(grdCopias.SqlSelect());
}



ActivarScripts


Descripción: Activa/Desactiva la ejecución de scripts de de la grid. Si no se activa, la programación de pantalla que tienen los eventos de la grid, no se lanzará.

Tipo: True/False (por defecto, False).


Código en VB6:

Sub Show()
 gForm.Controls("grdLineas").ActivarScripts = True

End Sub

Código en C#:

private void Show()
{
  (gForm.Controls["grdCopias"] as ICntGridUsuario).ActivarScripts = true;
}


AgregaColumna


Descripción: Este método crea las columnas en el grid. Son objetos de tipo CampoGrid y accederemos a las columnas del grid mediante la estructura: [NombreGrid].Campo ("NombreDeCampo").


Parámetros de entrada:


Parámetros obligatorios:


-  Campo (String): Especifica el nombre del campo del origen de datos.

-  Ancho (LONG): Establece el ancho de la columna (en TWIPS).

-  Descripción (String): Especifica el nombre de la cabecera de la columna.


Parámetros Opcionales:


-  Locked (Boolean): Indica que el campo se bloquea y no se puede modificar.

-  Combo (String): Consulta SQL con los campos que queremos que muestre el combo. El primer campo es el que quedará en la celda al seleccionar el dato de la lista y los restantes los que desplegará el combo. Ejemplo: SELECT IdArticulo Art, IdArticulo, Descrip FROM Articulo         


Si queremos que se quede la descripción lo haremos de la siguiente manera: SELECT Descrip Desc, IdArticulo, Descrip FROM Aticulos    

   
La consulta también puede hacer referencia a un campo de la grid. Por ejemplo si en el grid tenemos un campo IdFamilia y queremos que el combo nos muestre solo los artículos de esa familia. Para hacer referencia a un campo de la grid, en la sentencia SELECT lo especificamos con "@nombrecampo". Ejemplo: SELECT IdArticulo Art, IdArticulo, Descrip FROM Articulos WHERE IdFamilia = @IdFamila


-  RowRefreshCombo (Boolean): Establece que se refresque el combo al cambiar de celda, siempre y cuando la consulta del combo dependa de otro campo (como en el ejemplo anterior).

-  Format (String): Indica el formato de visualización del campo. Ejemplo numérico con tres decimales: "#,##0.000". Ejemplos fecha: "mm/dd/yyyy", "yyyymmdd", etc.


-  Total (Boolean): Indica si debe agregar un campo al final con la suma de los campos la columna.

-  Valores (String): Sentencia SQL que especifica el valor del combo que queremos que se vea en la celda. Por ejemplo, si quiero seleccionar del combo el IdArticulo y que éste se almacene en tabla, pero mostrar en pantalla (y en la misma celda) la descripción.


El combo quedaría de ésta manera: SELECT IdArticulo Art, IdArticulo, Descrip FROM Articulos    
Mientras que el parámetro valores sería: SELECT IdArticulo, Descrip FROM Articulos
Así estaríamos guardando el IdArtículo seleccionado, pero en la celda se visualizaría la descripción.


-  EsResourceID (Boolean): Indica que el valor del campo será un Icono. Con lo cual cargará en la celda la imagen correspondiente. Siempre depende de la propiedad valor. Por ejemplo para cargar un Icono, la SELECT debería ser: SELECT Objeto Obj, Objeto, Icono1 FROM Objetos

-  ValorFiltro: OBSOLETO. NO USAR

-  Obligado (Boolean): Indica que el campo es obligatorio. Si el usuario no lo completa, saldrá un mensaje advirtiendo ésto.


Parámetros de salida: True/False, devuelve True si la columna se ha podido crear.


Código en VB6:

 Sub Initialize()
   With gForm.Controls("grdUserStock")
     .activarscripts = True
     .from = "Pers_VStockMinimos"
     .agregacolumna "IdProveedorPreferencial",1000,"Id. Prov"
     .agregacolumna "Proveedor",1000,"Proveedor"
     .campo("IdProveedorPreferencial").Column.Order = 2
     .campo("Proveedor").Column.Order = 3
     Set gForm.Controls("filStockMinimo").GridUsuario = 
         Form.Controls("grdUserStock")
     .SoloArray = False
     .refrescar
     .SoloArray = True    
   End With
 End Sub 

Código en C#:

private void Initialize()
{
  ICntGridUsuario grdUserStock = (gForm.Controls["grdUserStock"] as ICntGridUsuario);
  ICntFiltroUsuario filStockMinimo = (gForm.Controls["filStockMinimo"] as ICntFiltroUsuario);

  grdUserStock.ActivarScripts = true;
  grdUserStock.From = "Pers_VStocksMinimos";
  grdUserStock.AgregaColumna("IdProveedorPreferencial", 75, "Id.Prov.");
  grdUserStock.AgregaColumna("Proveedor", 250, "Proveedor");
  grdUserStock.Campo("IdProveedorPreferencial").Orden = 2;
  filStockMinimo.GridUsuario = grdUserStock;
  grdUserStock.SoloArray = false;
  grdUserStock.Refrescar();
  grdUserStock.SoloArray = true;
}


GetValue


Descripción: Devuelve el valor del campo dado de la fila activa

Parámetros de entrada: Nombre del campo (String)

Parámetros de salida: Valor del campo dado (Variant)


Código en VB6:

 Sub Grid_BeforeUpdate(aGrid,aCancel)
   If aGrid.GetValue("Bloqueado")=True Then
     MsgBox "No se puede actualizar una copia bloqueada",vbCritical
     aCancel=True   
   End If
 End Sub 

Código en C#:

//Para Activar este evento hay que configurar la grid. Poner en el void Initialize por ejemplo: (gForm.Controls["grdLineas"] as ICntGridUsuario).ActivarScripts = true;
public void Grid_BeforeUpdate(ICntGridUsuario aGrid, Valor aCancel)
{
	if (aGrid.GetValue("Bloqueado"))
	{
		AhoraCore.VBA.Interaction.MsgBox("No se puede actualizar una copia bloqueada", vbCritical);
		aCancel = true;
	}
}


GridClear


Descripción: Borra el contenido de la grid

Parámetros de entrada: si reestablece las columnas, encabezados y otras propiedades en función del datasource actual (Boolean, opcional, por defecto True)


Código en VB6:

 Sub LlamaGridClear()
   gForm.Controls("grdCopias").GridClear
 End Sub

Código en C#:

private void LlamaGridClear()
{
  (gForm.Controls["grdCopias"] as ICntGridUsuario).GridClear();
}



LimpiaGrid


Descripción: Borra el contenido de la grid y elimina las columnas creadas

Parámetros de salida:


Código en VB6:

 Sub LlamaLimpiaGrid()
   gForm.Controls("grdCopias").LimpiaGrid
 End Sub

Código en C#:

private void LlamaLimpiaGrid()
{
  (gForm.Controls["grdCopias"] as ICntGridUsuario).LimpiaGrid();
}


Imprimir


Descripción: Imprime la grid

Parámetros de entrada: Título de página(String, opcional),  si la grid tiene los parámetros de impresión configurados (Booleano, opcional, por defecto True). Si el segundo parámetro está a True, no hará caso al primero.

Parámetros de salida: True/False, devuelve True si la grid se ha mandado a la impresora correctamente.

Código en VB6:

 Sub LlamaImprimeGrid()
   gForm.Controls("grdCopias").Imprimir
 End Sub

Código en C#:

private void LlamaImprimeGrid()
{
  (gForm.Controls["grdCopias"] as ICntGridUsuario).Imprimir();
}



Descripción: Inserta un botón en el menú popup de la grid. Es el mismo método de inserción de botones de menú y botonera. Cuando se presiona un botón popup de la grid, se activa el evento MenuClick. Hay que tener en cuenta que al añadir una opción de menú, también hay que implementar la acción de dicho menú.

Parámetros de entrada: : Caption del Botón(String), Id (String), Tipo de botón (String), Padre (Id del menú cuelga el botón, si no se especifica se entiende que es Padre), Nuevo Grupo (línea separadora que separará el botón de los anteriores) (Booleano), ResId (idIcono de la tabla Iconos_Recursos), Before (si queremos colocarlo antes de otro botón especificamos el nombre del botón).          
Los tipos de botones son:

  • eTipo_Menu_Boton (Botón convencional)
  • eTipo_Menu_Check (botón de tipo check)
  • eTipo_Menu_Combo (sólo para el control Botonera)
  • eTipo_Menu_Edit (Botón con caja de texto para edición)
  • eTipo_Menu_Menu (Botón de tipo menú de cabecera)

Parámetros de salida: El objeto AhoraTool creado


Código en VB6:

 Sub Grid_BeforeLoad(aGrid)  
    If aGrid.Name = "grdCopias" Then aGrid.MenuItemAdd "Duplicar copia",  "mnuDuplicar", 0 , ,True, False, 123 
End Sub  
Sub grid_MenuAfterExecute(aGrid, aMenuItem)  
    If amenuitem.Name ="mnuDuplicar" Then   
        Duplicar  
    End If 
End Sub 

Código en C#:

public void Grid_BeforeLoad(ICntGridUsuario aGrid)
{
  if (aGrid.Name == "grdCopias")
  {
    aGrid.MenuItemAdd("Duplicar copia", "mnuDuplicar", ETipo_Menu.eTipo_Menu_Boton, "", true, false, 123);
  }
}
//Para Activar este evento hay que configurar la grid. Poner en el void Initialize por ejemplo: (gForm.Controls["grdLineas"] as ICntGridUsuario).ActivarScripts = true;
public void Grid_MenuAfterExecute(ICntGridUsuario aGrid, IAhoraTool aMenuItem)
{
  if (aMenuItem.Name == "mnuDuplicar")
  {
    // Duplicar
  }
}


PasoExcel


Descripción: Exporta a Excel el contenido de la grid

Parámetros de salida: True/False, devuelve True si la exportación no da ningún error.


Código en VB6:

 Sub LlamaPasoExcel()
   gForm.Controls("grdCopias").PasoExcel
 End Sub 

Código en C#:

private void LlamaPasoExcel()
{
  (gForm.Controls["grdCopias"] as ICntGridUsuario).PasoExcel();
}


Refrescar


Descripción: Refresca la grid.

Código en VB6:

 gForm.Controls("grdCopias").Refrescar

Código en C#:

(gForm.Controls["grdCopias"] as ICntGridUsuario).Refrescar();


SetValue


Descripción: Modifica el campo por el valor dado en la fila activa.

Parámetros de entrada: Campo (String), Valor (Variant)

Parámetros de salida: True/False, devuelve True si se ha modificado el valor correctamente

Código en VB6:

 Sub ejSetValue
gForm.Controls("grdCopias").setvalue "FechaIni", "01/01/2015"
End Sub

Código en  C#:

private void EjSetValue()
{
(gForm.Controls["grdCopias"] as ICntGridUsuario).SetValue("FechaIni", "01/01/2015");
}


Eventos

La mayoría de los eventos suelen tener un nombre autoexplicativo y, en su mayoría, son los que suelen tener las grids estándar.



Descripción: se dispara cuando hacemos clic en un botón del menú popup del grid


GridLoad

Descripción: se dispara cuando se refresca la grid, es decir, cuando llamamos al método refrescar o cuando actualizamos un registro.



Campo (NombreCampo)


Este objeto es el campo, propiamente dicho, del grid. En este objeto se guardan las propiedades mencionadas en el método AgregaColumna( ) del grid.

Tipo: CampoGrid.


Código en VB6:

gForm.Controls("grdCopias").Campo("IdCopia").Booleano = False

Código en C#:

(gForm.Controls["grdCopias"] as ICntGridUsuario).Campo("IdCopia").Booleano = false;




Sustitucion

Descripción: Valor que tomará el campo cuando se actualice una celda de la misma fila.

Tipo: String.


Código en VB6:

gForm.Controls("grdCopias").Campo("IdCopia").Sustitucion = "SELECT NuevoValor FROM Tabla"

Código en C#:

(gForm.Controls["grdCopias"] as ICntGridUsuario).Campo("IdCopia").Sustitucion = "SELECT NuevoValor FROM Tabla";


Booleano

Descripción: Dibuja un control CheckBox

Tipo: Boolean.


Código en VB6:

gForm.Controls("grdCopias").Campo("IdCopia").Booleano = False

Código en C#:

(gForm.Controls["grdCopias"] as ICntGridUsuario).Campo("IdCopia").Booleano = false;


CampoFecha

Descripción: Establece un control Fecha para el campo.

Tipo: String.


Código en VB6:

gForm.Controls("grdCopias").Campo("IdCopia").CampoFecha = False

Código en C#:

(gForm.Controls["grdCopias"] as ICntGridUsuario).Campo("IdCopia").CampoFecha = false;


Default

Descripción: Establece un valor por defecto para los registros nuevos.

Tipo: String.


Código en VB6:

gForm.Controls("grdCopias").Campo("IdCopia").Default = 0;

Código en C#:

(gForm.Controls["grdCopias"] as ICntGridUsuario).Campo("IdCopia").Default = 0;


AsignaAsistente

Descripción: Lanza un AhoraProceso llamado AhoraAsistente. Cuando se pulsa F3 despliega un formulario con filtro para buscar el dato. Este procedimiento sólo define el formulario y va acompañado del método AssistAddField ( ), que definirá las columnas de la grid del asistente.

Parámetros de entrada: Número de Icono que queremos que aparezca en el Form (Long), Instrucción SQL, origen de datos (String), Where, filtro SQL, puede ser una cadena vacía (String), Lista de campos a ordenar separados por comas (String),

Nombre del campo grid. Si queremos que aparezca en el campo del asistente (String, opcional), Ancho del formulario (Long, opcional), Alto del formulario (String, opcional)


Puede consultar información detallada sobre este método en el siguiente artículo.


AssistAddField

Descripción: Define los campos de la grid del asistente F3.

Parámetros de entrada: Nombre del campo que queremos que aparezca en el grid (String), Descripción del campo (String, opcional), Tipo de dato (si se mostrará un String, long, etc) (Long, opcional), Tamaño del campo (Long, opcional), Autosize (Boolean, opcional),Indica que es el campo que queremos que nos retorne. Si no se especifica el asistente nos devuelve el primero que declaremos (Boolean, opcional).


Puede consultar información detallada sobre este método en el siguiente artículo.


CampoNuevaFila

Descripción: Indica qué campo tendrá el foco cuando la grid crea una nieva fila. es decir, la primera vez que se carga o cuando se inserta una línea.

Tipo: cadena.


Código en VB6:

Sub Initialize()
     gform.Controls("Botonera").ActivarScripts = True
End Sub
 
Sub Botonera_AfterExecute(aBotonera, aBoton) 
     If aboton.name = "botGuardar" Then
         Establecefoco
     End If 
End Sub

Sub Establecefoco ()
     Dim g 'As AhoraOCX.cntGridUsuario
     Set g = gForm.Controls("grdlineas")
     If g.rowcount = 0 Then 
         g.CampoNuevaFila = "@CodigoBarras"
     End If
End Sub

Código en C#:

private void Initialize()
{
  (gForm.Controls["grdUserStock"] as ICntBotonera).ActivarScripts = true;
}

public void Botonera_AfterExecute(ICntBotonera aBotonera, IAhoraTool aBoton)
{
  if (aBoton.Name == "botGuardar")
  {
    EstableceFoco();
  }
}

private void EstableceFoco()
{
  AhoraOCX.Form gForm = new AhoraOCX.Form();
  ICntGridUsuario g = (gForm.Controls["grdLineas"] as ICntGridUsuario);
  if (g.RowCount == 0)
  {
    g.CampoNuevaFila = "@CodigoBarras";
  }

}


--------------------------------------------------------------------------------------------------------------

Ejemplos completos


Ejemplo CampoGrid


Código en VB6:

 Sub Initialize()  
    Set lPnlEjemplos = gForm.Controls.Add("AhoraOCX.cntPanel", "PnlEjemplos")
    lPnlEjemplos.Resized = True  
    lPnlEjemplos.ResizeEnabled = False  
    lPnlEjemplos.ResizeInterior = True  
    lPnlEjemplos.Estilo = 0   
    lPnlEjemplos.Visible = True   
    gForm.TabMain.InsertItem  110, "&Ejemplo", lPnlEjemplos.Hwnd, 1  
    Set lGrid = gForm.Controls.Add("AhoraOCX.cntGridUsuario", "Pers_GrdEjemplo", lPnlEjemplos)
End Sub  

Sub Show()  
    ejCargaGrid 
End Sub  

Sub ejCargaGrid()   
    If gform.eobjeto.objglobal.nuevo = False Then    
        With gForm.Controls("Pers_GrdEjemplo")      
            If Not .Preparada Then        
                .Activarscripts = True        
                .Agregar = True        
                .Editar = True        
                .Eliminar = True        
                .CargaObjetos = False 'al estar a False necesitamos indicar la tabla donde guarda        
                .EditarPorObjeto = False         
                Set .Coleccion = gcn.Obj.DameColeccion("Proveedores_Articulos","WHERE idProveedor = " & gForm.Controls("IdProveedor") ,True,True)       
                .From = "Vprov_Articulos"       
                .AgregaColumna "IdProveedor", 0, "IdProveedor"           
                .AgregaColumna "IdArticulo", 1000, "Id artículo", False, "SELECT IdArticulo, IdArticulo, Descrip FROM VCombo_Articulos"             
                .AgregaColumna "@Descrip", 1000, "Descripción" , True            .AgregaColumna "Precio", 1000, "Precio"        'valor por defecto para el campo IdProveedor y precio       
                .Campo("IdProveedor").Default = gForm.Controls("EObjeto").ObjGlobal.Propiedades("IdProveedor")       
                .Campo("Precio").Default = 0             'Sustituciones       
                .Campo("@Descrip").Sustitucion = "SELECT Descrip FROM VCombo_Articulos WHERE IdArticulo = @IdArticulo"        'Asistentes       
                With .Campo("IdArticulo")         
                    .AsignaAsistente gCn.Obj.Objetos("Articulos").Entorno.Icono1, "vCombo_Articulos", "", "IdArticulo", "IdArticulo", 8000, , False         'Campos del asistente        
                    .AssistAddField "IdArticulo", "Id Artículo", "String", 2000, , True         .AssistAddField "Descrip", "Descripción", "String", 4500       
                End With       
                .ColumnaEscalada = "@Descrip"     
            End If      
            .Visible = True     
            .Refresca = True    
        End With  
    End If 
End Sub 

Código en C#:

using AhoraCl;
using AhoraCore;
using AhoraOCX;
using AhoraSistema;
using static AhoraCore.VBA.Conversion;
using System;

namespace AhoraScriptsPantalla
{
    public class AhoraCl_frmProveedores : AhoraOCX.AhoraBaseScript

    {

    public void Initialize()
    {
      IControl lGrid = null;
      ICntPanel lPnlEjemplos = null;
      try {
        lPnlEjemplos = (ICntPanel)gForm.Controls.Add("AhoraOCX.CntPanel", "PnlEjemplos", null);
        lPnlEjemplos.Resized = true;
        ((IControlResizable) lPnlEjemplos).ResizeEnabled = false;
        ((ICntPanel) lPnlEjemplos).ResizeInterior = true;
        lPnlEjemplos.Estilo = 0;
        lPnlEjemplos.Visible = true;
        ((ICntTab) gForm.Controls["TabMain"]).InsertItem(110, "&Ejemplo", lPnlEjemplos, 1);
        lGrid = gForm.Controls.Add("AhoraOCX.cntGridUsuario", "Pers_GrdEjemplo", lPnlEjemplos);
      } catch (Exception) {
        throw;
      }
    }


    public void Show()
    {
      try {
        ejCargaGrid();
      } catch (Exception) {
        throw;
      }
    }


    public void ejCargaGrid()
    {
      try {
        if (((IEnlaceObjetos) gForm.FindControl("EObjeto")).ObjGlobal.Nuevo == false) {
          if (!((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).Preparada) {
            ((IControlScriptable) gForm.Controls["Pers_GrdEjemplo"]).ActivarScripts = true;
                        ((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).Agregar = true;
            ((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).Editar = true;
            ((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).Eliminar = true;
            ((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).CargaObjetos = false;
            ((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).EditarPorObjeto = false;
                        ((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).Coleccion = gCn.Obj.DameColeccion("Proveedores_Articulos", "WHERE idProveedor = " + (gForm.Controls["IdProveedor"] as ITextoUsuario).Text, true, true);
            ((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).From = "Vprov_Articulos";
            ((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).AgregaColumna("IdProveedor", 0, "IdProveedor");
            ((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).AgregaColumna("IdArticulo", 67, "Id artículo", false, "SELECT IdArticulo, IdArticulo, Descrip FROM VCombo_Articulos");
            ((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).AgregaColumna("@Descrip", 67, "Descripción", true);
            ((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).AgregaColumna("Precio", 67, "Precio");
            ((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).Campo("IdProveedor").Default = ((IEnlaceObjetos) gForm.Controls["EObjeto"]).ObjGlobal["IdProveedor"];
            ((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).Campo("Precio").Default = 0;
            ((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).Campo("@Descrip").Sustitucion = "SELECT Descrip FROM VCombo_Articulos WHERE IdArticulo = @IdArticulo";
            ((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).Campo("IdArticulo").AsignaAsistente(CStr(gCn.Obj.Objetos["Articulos"].Entorno.Icono1), "vCombo_Articulos", "", "IdArticulo", "IdArticulo", 8000, 0, false);
            ((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).Campo("IdArticulo").AssistAddField("IdArticulo", "Id Artículo", ETipoDato.String, 2000, false, true);
            ((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).Campo("IdArticulo").AssistAddField("Descrip", "Descripción", ETipoDato.String, 4500);
          
            ((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).ColumnaEscalada = "@Descrip";
          }
          gForm.Controls["Pers_GrdEjemplo"].Visible = true;
          ((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).Refresca = true;
        
        }
      } catch (Exception) {
        throw;
      }
    }

    }

}


Ejemplo Control Grid


Con este código al hacer doble clic sobre una columna ejecutamos una instrucción SQL.

Podemos ver como se piden parámetros para que introduzca el usuario, como se realizan consultas a la base de datos y como se obtienen los valores de una grid:


Código en VB6:

 Sub Initialize()  
    gForm.Controls("grdLineas").ActivarScripts = True 
End Sub  'Para Activar este evento hay que configurar la grid. Poner en el sub Initialize por ejemplo: gForm.grdLineas.ActivarScripts = True  

Sub Grid_DblClick(aGrid)  
    columna    = aGrid.CampoActual  
    idDoc      = aGrid.GetValue("idDoc")   
    If (columna = "Precio") Then   
        NuevoPrecio = InputBox("Nuevo precio: ","Nuevo precio ")    
        If Not IsNumeric(NuevoPrecio) Then     
            MsgBox "El precio introducido no es válido"    
        Else     
            If Not (gcn.executeSql("UPDATE Listas_Precios_Prov_Art SET precio =  " & NuevoPrecio & "  WHERE idDoc = "& idDoc )) Then      
                MsgBox "No se ha modificado correctamente"     
            Else      
                MsgBox "Se ha modificado correctamente"     
            End If   
        End If  
    End If 
End Sub

Código en C#:

public void Initialize()
{
  (gForm.Controls["grdLineas"] as ICntGridUsuario).ActivarScripts = true;
}

//Para Activar este evento hay que configurar la grid. Poner en el void Initialize por ejemplo: (gForm.Controls["grdLineas"] as ICntGridUsuario).ActivarScripts = true;
public void Grid_DblClick(ICntGridUsuario aGrid)
{
  string lColumna = aGrid.CampoActual;
  Valor lIdDoc = aGrid.GetValue("IdDoc");
  if (lColumna == "Precio")
  {
    Valor lNuevoPrecio = AhoraCore.VBA.Interaction.InputBox("Nuevo precio: ", "Nuevo precio ");
    if (!IsNumeric(lNuevoPrecio))
    {
      AhoraCore.VBA.Interaction.MsgBox("El precio introducido no es válido");
    }
    else
    {
      if (!gCn.ExecuteSql("UPDATE Listas_Precios_Prov_Art SET Precio = " + lNuevoPrecio + " WHERE IdDoc = " & lIdDoc))
      {
        AhoraCore.VBA.Interaction.MsgBox("No se ha modificado correctamente");
      }
      else
      {
        AhoraCore.VBA.Interaction.MsgBox("Se ha modificado correctamente");
      }
    }
  }
}


Éste es el evento antes de actualizar la columna del grid, advertimos al usuario que la máquina es genérica. Formulario de inicio de un contrato (frmContratos_Inicio)

Código en VB6:

 Sub Initialize()     
    gForm.grdLineas.ActivarScripts = True   
End Sub  'Para Activar este evento hay que configurar la grid. Poner en el sub Initialize por ejemplo: gForm.grdLineas.ActivarScripts = True  

Sub Grid_BeforeColUpdate(aGrid,aColIndex,aOldValue,aCancel)    
    If agrid.columns("Descrip2").colindex = acolindex Then    'comprobar que la descripción2  no es igual que la descripción y si es genérica avisar y  quitar la descripción2.         
        If agrid.columns("Descrip2").Value = agrid.columns("Descrip").Value Then         
            MsgBox "No puede enviar duplicar descipciones. Cambie una de las dos descripciones."          
            acancel = True      
        End If     
    End If   
End Sub 

Código en C#:

public void Initialize()
{
  (gForm.Controls["grdLineas"] as ICntGridUsuario).ActivarScripts = true;
}

//Para Activar este evento hay que configurar la grid. Poner en el void Initialize por ejemplo: (gForm.Controls["grdLineas"] as ICntGridUsuario).ActivarScripts = true;
public void Grid_BeforeColUpdate(ICntGridUsuario aGrid, int aColIndex, Valor aOldValue, bool aCancel)
{
  // Comprobar que la descripción2  no es igual que la descripción y si es genérica avisar y quitar la descripción2.
  if (aGrid.Columns["Descrip2"].ColIndex == aColIndex)
  {
    if (aGrid.Columns["Descrip2"].Value == aGrid.Columns["Descrip"].Value)
    {
      AhoraCore.VBA.Interaction.MsgBox("No puede enviar duplicar descipciones. Cambie una de las dos descripciones.");
      aCancel = true;
    }
  }

}


Este evento se ejecuta antes de cargar la grid. En él modificamos el origen de datos de ésta.


De esta forma, si tenemos configurada la grid con campos configurables los podemos mostrar. Este evento estaba en el formulario de listas de precios de clientes.

Código en VB6:

 Sub Initialize()
   gForm.Controls("grdLineas").ActivarScripts=True
 End Sub
 'Para Activar este evento hay que configurar la grid. Poner en el sub Initialize por ejemplo: gForm.grdLineas.ActivarScripts = True 
 'Este evento sólo se ejecuta cuando se obtiene la configuración de la grid,es decir, si no se cambia la config. sólo una vez. 
 Sub Grid_BeforeLoad(aGrid) 
   If aGrid.name = "grdLineas" Then   
     aGrid.From = "VCLIENTE_Listas_Precios_Cli_SinAjenas" 
   End If 
 End Sub 

Código en C#:

public void Initialize()
{
  (gForm.Controls["grdLineas"] as ICntGridUsuario).ActivarScripts = true;
}

//Para Activar este evento hay que configurar la grid. Poner en el void Initialize por ejemplo: (gForm.Controls["grdLineas"] as ICntGridUsuario).ActivarScripts = true;
public void Grid_BeforeLoad(ICntGridUsuario aGrid)
{
  if (aGrid.Name == "grdLineas")
  {
    aGrid.From = "VCLIENTE_Listas_Precios_Cli_SinAjenas";
  }
}


Ejemplo Control Grid: Array sin origen de datos y campos sustitución

  • Cuando no se desea cargar datos en el grid, simplemente que el usuario los introduzca, no es necesario poner un origen de datos.
  • Utilizaremos sustitución cuando se selecciona un artículo y queremos que se actualice el campo Descripción, y viceversa.
  • Al insertar un nuevo registro queremos que el campo cantidad por defecto sea 1.

Código en VB6:

 Sub Initialize()  
    Set lPnlArtics = gForm.Controls.Add("AhoraOCX.cntPanel", "PnlArtics")
    lPnlArtics.Resized = True  
    lPnlArtics.ResizeEnabled = False  
    lPnlArtics.ResizeInterior = True  
    lPnlArtics.Estilo = 0   
    lPnlArtics.Visible = True      
    gForm.TabMain.InsertItem  110, "&Articulos", lPnlArtics.Hwnd, 1       
    Set lGrid = gForm.Controls.Add("AhoraOCX.cntGridUsuario", "Pers_GrdArtics", PnlArtics) 
    CargaGrdArticulosConSust    
End Sub 

Sub CargaGrdArticulosConSust() 
    'Crearemos un grid de sólo array para introducir artículos y cantidades 
    'Seleccionaremos los artículos de un combo 
    'Al seleccionar el artículo se actualzará la descripción y viceversa 
    With gForm.Controls("Pers_GrdArtics") 
        Set .Container = gForm.Controls("PnlArtics")    
        .Visible = True      
        If Not .Preparada Then      
            .Agregar = True      
            .Editar = True      
            .Eliminar = True      
            .CargaObjetos = False      
            .EditarPorObjeto = False      
            .Grid.FetchRowStyle = False      'Agregamos columna con formato numérico (Ver lib Ahora_Constantes)      
            .AgregaColumna "Cantidad", 1000, "Cantidad", , , , "#,##0"      
            .AgregaColumna "IdArticulo", 1500, "Articulo", , "Select IdArticulo, IdArticulo, Descrip From Articulos"      
            .AgregaColumna "Descrip", 2500, "Descripcion", , "Select Descrip, Descrip, IdArticulo From Articulos"            
            .From = "" 'sin origen de datos porque los introducirá el usuario      
            .Where = ""      
            .OrdenMultiple = ""       'Sustituciones      
            .Campo("IdArticulo").Sustitucion = "SELECT IdArticulo FROM Articulos WHERE Descrip = @Descrip"      
            .Campo("Descrip").Sustitucion = "SELECT Descrip FROM Articulos WHERE IdArticulo = @IdArticulo"      
            .Campo("Cantidad").Default = 1      
            .SoloArray = False      
            .Refresca = True    
        End If    
        .SoloArray = True    
        .Refresca = False  
    End With 
End Sub

Código en C#:

using AhoraCl;
using AhoraCore;
using AhoraOCX;
using AhoraSistema;
using System;
using System.Windows.Forms;

namespace AhoraScriptsPantalla
{
    public class AhoraCl_frmArticulos : AhoraOCX.AhoraBaseScript

    {

    public void Initialize()
    {
      IControl lGrid = null;
      ICntPanel lPnlArtics = null;
      try {
        lPnlArtics = (ICntPanel)gForm.Controls.Add("AhoraOCX.CntPanel", "PnlArtics", null);
        lPnlArtics.Resized = true;
        ((IControlResizable) lPnlArtics).ResizeEnabled = false;
        ((ICntPanel) lPnlArtics).ResizeInterior = true;
        lPnlArtics.Estilo = 0;
        lPnlArtics.Visible = true;
        ((ICntTab) gForm.FindControl("TabPrincipal")).InsertItem(110, "&Articulos M", lPnlArtics, 1);
        lGrid = gForm.Controls.Add("AhoraOCX.CntGridUsuario", "Pers_GrdArtics", lPnlArtics);
        CargaGrdArticulosConSust();
      } catch (Exception) {
        throw;
      }
    }


    public void CargaGrdArticulosConSust()
    {
      try {
        //Crearemos un grid de sólo array para introducir artículos y cantidades 
        //Seleccionaremos los artículos de un combo 
        //Al seleccionar el artículo se actualzará la descripción y viceversa 
        gForm.Controls["Pers_GrdArtics"].Parent = (Control) gForm.Controls["PnlArtics"];
        gForm.Controls["Pers_GrdArtics"].Visible = true;
        if (!((ICntGridUsuario) gForm.Controls["Pers_GrdArtics"]).Preparada) {
                    ((ICntGridUsuario)gForm.Controls["Pers_GrdArtics"]).Agregar = true;
          ((ICntGridUsuario) gForm.Controls["Pers_GrdArtics"]).Editar = true;
          ((ICntGridUsuario) gForm.Controls["Pers_GrdArtics"]).Eliminar = true;
          ((ICntGridUsuario) gForm.Controls["Pers_GrdArtics"]).CargaObjetos = false;
          ((ICntGridUsuario) gForm.Controls["Pers_GrdArtics"]).EditarPorObjeto = false;
                    ((ICntGridUsuario) gForm.Controls["Pers_GrdArtics"]).FetchRowStyle = false;
          ((ICntGridUsuario) gForm.Controls["Pers_GrdArtics"]).AgregaColumna("Cantidad", 67, "Cantidad", false, "", false, "#,##0");
          ((ICntGridUsuario) gForm.Controls["Pers_GrdArtics"]).AgregaColumna("IdArticulo", 100, "Articulo", false, "Select IdArticulo, IdArticulo, Descrip From Articulos");
          ((ICntGridUsuario) gForm.Controls["Pers_GrdArtics"]).AgregaColumna("Descrip", 167, "Descripcion", false, "Select Descrip, Descrip, IdArticulo From Articulos");
          ((ICntGridUsuario) gForm.Controls["Pers_GrdArtics"]).From = "";
          ((ICntGridUsuario) gForm.Controls["Pers_GrdArtics"]).Where = "";
          ((ICntGridUsuario) gForm.Controls["Pers_GrdArtics"]).OrdenMultiple = "";
          //Sustituciones      
          ((ICntGridUsuario) gForm.Controls["Pers_GrdArtics"]).Campo("IdArticulo").Sustitucion = "SELECT IdArticulo FROM Articulos WHERE Descrip = @Descrip";
          ((ICntGridUsuario) gForm.Controls["Pers_GrdArtics"]).Campo("Descrip").Sustitucion = "SELECT Descrip FROM Articulos WHERE IdArticulo = @IdArticulo";
          ((ICntGridUsuario) gForm.Controls["Pers_GrdArtics"]).Campo("Cantidad").Default = 1;
          ((ICntGridUsuario) gForm.Controls["Pers_GrdArtics"]).SoloArray = false;
          ((ICntGridUsuario) gForm.Controls["Pers_GrdArtics"]).Refresca = true;
        }
        ((ICntGridUsuario) gForm.Controls["Pers_GrdArtics"]).SoloArray = true;
        ((ICntGridUsuario) gForm.Controls["Pers_GrdArtics"]).Refresca = false;
      
      } catch (Exception) {
        throw;
      }
    }

    }

}


Ejemplo Control Grid: sólo ARRAY usando Alias y campos calculados


En éste ejemplo el grid es de sólo edición y sólo queremos que se refresque cuando se llame al método cargaGridSelecTarifas. Le pondremos un FROM porque queremos que cargue datos por defecto.

Código en VB6:

 Sub cargaGridSelecTarifas()
    With grdSelecTarifas
     If Not .Preparada Then
      .Agregar = False
      .Editar = True
      .Eliminar = False
      .CargaObjetos = False
      .Alias = "a"
      '-Columna Marca (Columna Calculada) no existe en las tablas.
      '-Se especifica con @
      .AgregaColumna "@Marca", 700, "Marca"
      .AgregaColumna "IdDelegacion", 1000, "Delegacion", True
      .AgregaColumna "IdLista", 500, "Lista", True
      .AgregaColumna "Descrip", 1000, "Descripción", True
      '-Establecemos el tipo de datos y la sustitución
      .Campo("@Marca").Booleano = True
      .Campo("@Marca").Sustitucion = "Select 0"
  
      .From="(SELECT cc.IdDelegacion,lpc.IdLista,lpc.Descrip,lpc.IdDoc" & "FROM Listas_Precios_Cli lpc " & "INNER JOIN Ceesi_Configuracion cc ON " & "lpc.IdLista=cc.Valor WHERE cc.Parametro='LISTAPRECIOS_DEFECTO')a"
      '-Queremos que sólo cargue las tarifas para la delegación actual.
      '-GCN es el objeto conexión.
      .Where = " WHERE a.IdDelegacion = " & gCn.IdDelegacion
      .OrdenMultiple = " IdDelegacion, IdLista"
     End If
     '-Cuando es un grid de solo Array el orden de refresco es el siguiente: si se cambia el orden da error
     .SoloArray = False
     .Refresca = True '-Hacemos el refresco 1 vez.
     .SoloArray = True
     .Refresca = False '-Dejamos la grid como sólo array.
   End With
  End Sub 

Código en C#:

public void cargaGridSelecTarifas()
{
  IControl grdSelecTarifas = null;
  try
  {
    if (!((ICntGridUsuario)grdSelecTarifas).Preparada)
    {
      ((ICntGridUsuario)grdSelecTarifas).Agregar = false;
      ((ICntGridUsuario)grdSelecTarifas).Editar = true;
      ((ICntGridUsuario)grdSelecTarifas).Eliminar = false;
      ((ICntGridUsuario)grdSelecTarifas).CargaObjetos = false;
      ((ICntGridUsuario)grdSelecTarifas).Alias = "a";
      //-Columna Marca (Columna Calculada) no existe en las tablas.
      //-Se especifica con @
      ((ICntGridUsuario)grdSelecTarifas).AgregaColumna("@Marca", 47, "Marca");
      ((ICntGridUsuario)grdSelecTarifas).AgregaColumna("IdDelegacion", 67, "Delegacion", true);
      ((ICntGridUsuario)grdSelecTarifas).AgregaColumna("IdLista", 33, "Lista", true);
      ((ICntGridUsuario)grdSelecTarifas).AgregaColumna("Descrip", 67, "Descripción", true);
      //-Establecemos el tipo de datos y la sustitución
      ((ICntGridUsuario)grdSelecTarifas).Campo("@Marca").Booleano = true;
      ((ICntGridUsuario)grdSelecTarifas).Campo("@Marca").Sustitucion = "Select 0";

      ((ICntGridUsuario)grdSelecTarifas).From = "(SELECT cc.IdDelegacion,lpc.IdLista,lpc.Descrip,lpc.IdDoc" + "FROM Listas_Precios_Cli lpc " + "INNER JOIN Ceesi_Configuracion cc ON " + "lpc.IdLista=cc.Valor WHERE cc.Parametro='LISTAPRECIOS_DEFECTO')a";
      //-Queremos que sólo cargue las tarifas para la delegación actual.
      //-GCN es el objeto conexión.
      ((ICntGridUsuario)grdSelecTarifas).Where = " WHERE a.IdDelegacion = " + gCn.IdDelegacion;
      ((ICntGridUsuario)grdSelecTarifas).OrdenMultiple = " IdDelegacion, IdLista";
    }
    //-Cuando es un grid de solo Array el orden de refresco es el siguiente: si se cambia el orden da error
    ((ICntGridUsuario)grdSelecTarifas).SoloArray = false;
    ((ICntGridUsuario)grdSelecTarifas).Refresca = true;
    ((ICntGridUsuario)grdSelecTarifas).SoloArray = true;
    ((ICntGridUsuario)grdSelecTarifas).Refresca = false;

  }
  catch (Exception)
  {
    throw;
  }
}


Ejemplo Control Grid: grid de sólo lectura con Alias y filtro WHERE


Código en VB6:

 Sub CargaGrdArticulosDeProv() '--Cuando se llame a éste procedimiento se aplicará el filtro WHERE '--Y mostrarán los artículos del proveedor especificado.  
    Dim lStrVista 'As String  
    lStrVista = "(SELECT pa.IdProveedor, pa.IdArticulo, a.Descrip, a.IdDoc " & "FROM Prov_Articulos pa " & "INNER Join Articulos a On " & "pa.IdArticulo = a.IdArticulo) Vista"  
    With gForm.Controls("Pers_GrdComisiones")  
        Set .Container = gForm.Controls("PnlComisiones")    
        .Visible = True     
        If Not .Preparada Then      
            .Agregar = False      
            .Editar = False      
            .Eliminar = False      
            .CargaObjetos = False      
            .EditarPorObjeto = False      
            .Grid.FetchRowStyle = False      
            .Alias = "Vista"      
            .AgregaColumna "IdArticulo", 1000, "IdArticulo"      
            .AgregaColumna "Descrip", 3000, "Descripción"      
            .From = lStrVista              
            .OrdenMultiple = ""    
         End If    
        .Where = "WHERE Vista.IdProveedor = " & gForm.Controls("IdProveedor").text     '--la func. sqlString me añade comillas   
        .Refresca = True   
    End With 
End Sub 

Código en C#:

public void CargaGrdArticulosDeProv()
{
  string lStrVista = "";
  try {
    lStrVista = "(SELECT pa.IdProveedor, pa.IdArticulo, a.Descrip, a.IdDoc " + "FROM Prov_Articulos pa " + "INNER Join Articulos a On " + "pa.IdArticulo = a.IdArticulo) Vista";
    gForm.Controls["Pers_GrdComisiones"].Parent = (Control) gForm.Controls["PnlComisiones"];
    gForm.Controls["Pers_GrdComisiones"].Visible = true;
    if (!((ICntGridUsuario) gForm.Controls["Pers_GrdComisiones"]).Preparada) {
      ((ICntGridUsuario)gForm.Controls["Pers_GrdComisiones"]).Agregar = false;
      ((ICntGridUsuario) gForm.Controls["Pers_GrdComisiones"]).Editar = false;
      ((ICntGridUsuario) gForm.Controls["Pers_GrdComisiones"]).Eliminar = false;
      ((ICntGridUsuario) gForm.Controls["Pers_GrdComisiones"]).CargaObjetos = false;
      ((ICntGridUsuario) gForm.Controls["Pers_GrdComisiones"]).EditarPorObjeto = false;
      ((ICntGridUsuario)gForm.Controls["Pers_GrdComisiones"]).FetchRowStyle = false;
      ((ICntGridUsuario)gForm.Controls["Pers_GrdComisiones"]).Alias = "Vista";
      ((ICntGridUsuario) gForm.Controls["Pers_GrdComisiones"]).AgregaColumna("IdArticulo", 67, "IdArticulo");
      ((ICntGridUsuario) gForm.Controls["Pers_GrdComisiones"]).AgregaColumna("Descrip", 200, "Descripción");
      ((ICntGridUsuario) gForm.Controls["Pers_GrdComisiones"]).From = lStrVista;
      ((ICntGridUsuario) gForm.Controls["Pers_GrdComisiones"]).OrdenMultiple = "";
    }
    ((ICntGridUsuario) gForm.Controls["Pers_GrdComisiones"]).Where = "WHERE Vista.IdProveedor = " + ((IControlEnlazable) gForm.Controls["IdProveedor"]).Text;
    ((ICntGridUsuario) gForm.Controls["Pers_GrdComisiones"]).Refresca = true;
  
  } catch (Exception) {
    throw;
  }
}


Ejemplo Control Grid: grid con colecciones y asistentes F3


Cuando la grid tiene la propiedad CargaObjeto=False, cuando actualizamos un registro significa que NO estamos actualizando el objeto. La grid no podrá contener los campos de la tabla configurables del objeto.

Código en VB6:

 Private Sub gridLoad()
 On Error GoTo Error_
   With GrdLineas
     If Not .Preparada Then
       .Agregar = True
       .Editar = True
       .Eliminar = True
       .CargaObjetos = False 'al estar a False necesitamos indicar la tabla donde guarda
       .EditarPorObjeto = True
       Set .Coleccion = EObjeto.ObjGlobal.Objetos("Trans_Prod_Lineas")
       .From = "Transformac_Lineas"
  
       .AgregaColumna "IdCodigo", 0, "IdCodigo"
       .AgregaColumna "IdLinea", 0, "IdLinea"
  
       .AgregaColumna "IdArticulo", 1875, "Id artículo", False, _
              "SELECT IdArticulo, IdArticulo, Descrip FROM VCombo_Articulos Order By IdArticulo"
       .AgregaColumna "@Descrip", 1875, gCn.Traducir(734, "Descripción"), False, _
              "SELECT Descrip, Descrip, IdArticulo FROM VCombo_Articulos Order By Descrip"
       .AgregaColumna "Unidades", 1000, "Unidades", , , , cFmt_Num2
       .AgregaColumna "Precio", 1000, "Precio", , , , cFmt_Eur, , , , , True
       'Sustituciones
       .Campo("IdArticulo").Sustitucion = _
 "SELECT IdArticulo FROM VCombo_Articulos WHERE Descrip = @@Descrip"
  
       .Campo("@Descrip").Sustitucion = _
 "SELECT Descrip FROM VCombo_Articulos WHERE IdArticulo = @IdArticulo"
       'Asistentes
       With .Campo("IdArticulo")
         .AsignaAsistente gCn.Obj.Objetos("Articulos").Entorno.Icono1, "vCombo_Articulos", "", "IdArticulo", "IdArticulo", 8000, , False
 'Campos del asistente
         .AssistAddField "IdArticulo", "Id Artículo", "String", 2000, , True
         .AssistAddField "Descrip", gCn.Traducir(734, "Descripción"), "String", 4500
       End With
       With .Campo("@Descrip")
         .AsignaAsistente gCn.Obj.Objetos("Articulos").Entorno.Icono1, "vCombo_Articulos", "", "Descrip", "Descrip", 8000, , False
         'Campos del asistente
         .AssistAddField "Descrip", gCn.Traducir(734, "Descripción"), "String", 4500
         .AssistAddField "IdArticulo", "Id Artículo", "String", 2000, , True
       End With
       .ColumnaEscalada = "@Descrip"
     End If
     Set .Coleccion = EObjeto.ObjGlobal.Objetos("Trans_Prod_Lineas")
     .Where = "WHERE 1 = 0"
     .Refresca = True
   End With
 End_:
   Exit Sub
 Error_:
   GCn.Tr.Trace TError, cModuleName, " gridLoad", , Err.Description
   Resume End_
 End Sub 

Código en C#:

private void gridLoad()
{
  ICntGridUsuario grdLineas = (gForm.Controls["grdLineas"] as ICntGridUsuario);
  if (!grdLineas.Preparada)
  {
    grdLineas.Agregar = true;
    grdLineas.Editar = true;
    grdLineas.Eliminar = true;
    grdLineas.CargaObjetos = false;
    grdLineas.EditarPorObjeto = true;
    grdLineas.Coleccion = (IColecciones)EObjeto.ObjGlobal.Objetos["Trans_Prod_Lineas"];
    grdLineas.From = "Transformac_Lineas";

    grdLineas.AgregaColumna("IdCodigo", 0, "IdCodigo");
    grdLineas.AgregaColumna("IdLinea", 0, "IdLinea");

    grdLineas.AgregaColumna("IdArticulo", 1875, "Id artículo", false, "SELECT IdArticulo, IdArticulo, Descrip FROM VCombo_Articulos Order By IdArticulo");
    grdLineas.AgregaColumna("@Descrip", 1875, gCn.Traducir(734, "Descripción"), false, "SELECT Descrip, Descrip, IdArticulo FROM VCombo_Articulos Order By Descrip");
    grdLineas.AgregaColumna("Unidades", 1000, "Unidades", false, null,false, cFmt_Num2);
    grdLineas.AgregaColumna("Precio", 1000, "Precio", false, null, false, cFmt_Eur, false, null, false, null, true);
    // Sustituciones

    grdLineas.Campo("IdArticulo").Sustitucion = "SELECT IdArticulo FROM VCombo_Articulos WHERE Descrip = @@Descrip";

    grdLineas.Campo("@Descrip").Sustitucion = "SELECT Descrip FROM VCombo_Articulos WHERE IdArticulo = @IdArticulo";
    // Asistentes

    grdLineas.Campo("IdArticulo").AsignaAsistente(gCn.Obj.Objetos["Articulos"].Entorno.Icono1.ToString(), "vCombo_Articulos", "", "IdArticulo", "IdArticulo", 8000, 0, false);
    // Campos del asistente

    grdLineas.Campo("IdArticulo").AssistAddField("IdArticulo", "Id Artículo", ETipoDato.String, 2000, false, true);
    grdLineas.Campo("IdArticulo").AssistAddField("Descrip", gCn.Traducir(734, "Descripción"), ETipoDato.String, 4500);

    grdLineas.Campo("@Descrip").AsignaAsistente(gCn.Obj.Objetos["Articulos"].Entorno.Icono1.ToString(), "vCombo_Articulos", "", "Descrip", "Descrip", 8000, 0, false);
    // Campos del asistente

    grdLineas.Campo("@Descrip").AssistAddField("Descrip", gCn.Traducir(734, "Descripción"), ETipoDato.String, 4500);
    grdLineas.Campo("@Descrip").AssistAddField("IdArticulo", "Id Artículo", ETipoDato.String, 2000, false, true);

    grdLineas.ColumnaEscalada = "@Descrip";
  }
  grdLineas.Coleccion = (IColecciones)EObjeto.ObjGlobal.Objetos["Trans_Prod_Lineas"];
  grdLineas.Where = "WHERE 1 = 0";
  grdLineas.Refresca = true;
}


¿Le ha sido útil este artículo?

¡Qué bien!

Gracias por sus comentarios

¡Sentimos mucho no haber sido de ayuda!

Gracias por sus comentarios

¡Háganos saber cómo podemos mejorar este artículo!

Seleccione al menos una de las razones
Se requiere la verificación del CAPTCHA.

Sus comentarios se han enviado

Agradecemos su esfuerzo e intentaremos corregir el artículo