Vous consultez une page technique concernant le logiciel de gestion Mercator. Celle-ci contient des informations spécifiques destinées aux professionnels de Mercator. Souhaitez-vous être redirigés vers des informations plus générales ?


   Ne plus poser cette question

Dans une grille personnalisée de signalétique, placer automatiquement une rupture et des totaux

0000002306     -      09/01/2023

Cette page est obsolète. Mercator permet d'ajouter une rupture sans code : voir cette page.


Le paramétrage illustré ici permet de placer par code une rupture sur une grille personnalisée de signalétique (MercatorUi.Forms.Sig.SigGrids.UserDefined) et de calculer un total d'une colonne numérique par rapport à cette rupture.

Le résultat est le suivant :

Cette programmation est construite autour d'un customizer SigCli qui implémente les interfaces MercatorUi.ICustomizers.IFormLoadCustomizer et MercatorUi.ICustomizers.IFormClosedCustomizer. Cela va permettre d'utililser l'évènement AfterColumnsCreated de la grille. Une référence sur UserDefinedGrid est obtenue par son ID (à modifier dans le code).

Par défaut, une grille de signalétique n'offre pas les fonctionnalités liées aux ruptures. Pour activer celles-ci, il faut :

  • mettre la propriété AllowRupture de la grille à true. Cette propriété ne peut être modifiée que si la DataSource de cette grille n'est pas encore déterminée. Ce qui n'est le cas à ce stade de la vie de la grille dans Mercator. Dès lors, il convient de prévoir cette commande grid.DataSource = null; et de restaurer ensuite la DataSource.
  • Pour autoriser une rupture, il faut utiliser un type de colonne spécifique : MercatorUi.GridPro.RupturableDataGridViewTextBoxColumn. Dès lors, nous supprimons toutes les colonnes déjà créées via grid.Columns.Clear(). Les colonnes seront ensuite toutes recréées par code.
  • Les deux lignes commençant par grid.RuptureCalculationColumnsList permettent de calculer le total dans la seconde colonne selon la rupture. 
  • Dans cette colonne, la rupture doit pouvoir amener une valeur DbNull sur la ligne d'entête de la rupture. Ceci est autorisé par cette commande : dt.Columns["temps"].AllowDBNull = true;

En fin de code, nous exécutons de façon asynchrone (via un TimerOneShot) l'activation de la rupture sur la première colonne.

Le code de ce customizer est le suivant :

Zoom
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using MercatorApi;
using MercatorUi;
using System.Windows.Forms;

namespace SigCli
{
    public class Customizer : MercatorUi.ICustomizers.IFormLoadCustomizer, MercatorUi.ICustomizers.IFormClosedCustomizer
    {

        public void FormLoadCustomize(Form WindowsForm)
        {
            MercatorUi.Forms.Sig.SigForm sigForm = (MercatorUi.Forms.Sig.SigForm)WindowsForm;
            MercatorUi.MovableControls.MovableGrid userDefinedGrid = (MercatorUi.MovableControls.MovableGrid)sigForm.MovableControls["2834DF4A76"];
            userDefinedGrid.AfterColumnsCreated += new MercatorUi.MovableControls.MovableGrid.AfterColumnsCreatedHandler(userDefinedGrid_AfterColumnsCreated);
        }

        public void FormClosedCustomize(Form WindowsForm)
        {
            MercatorUi.Forms.Sig.SigForm sigForm = (MercatorUi.Forms.Sig.SigForm)WindowsForm;
            MercatorUi.MovableControls.MovableGrid userDefinedGrid = (MercatorUi.MovableControls.MovableGrid)sigForm.MovableControls["2834DF4A76"];
            userDefinedGrid.AfterColumnsCreated -= new MercatorUi.MovableControls.MovableGrid.AfterColumnsCreatedHandler(userDefinedGrid_AfterColumnsCreated);
        }

        void userDefinedGrid_AfterColumnsCreated(object sender, EventArgs e)
        {
            MercatorUi.MovableControls.MovableGrid userDefinedGrid = (MercatorUi.MovableControls.MovableGrid)sender;
            MercatorUi.GridPro.DataGridViewXPro grid = userDefinedGrid.Grid;
            grid.Columns.Clear();
            DataTable dt = (DataTable)grid.DataSource;
            dt.Columns["temps"].AllowDBNull = true;
            grid.DataSource = null;
            grid.AllowRupture = true;
            grid.DataSource = dt;
            grid.Columns.Add(new MercatorUi.GridPro.RupturableDataGridViewTextBoxColumn("titre", "Titre"));
            grid.Columns["titre"].Width = 100;
            grid.Columns["titre"].DataPropertyName = "titre";

            grid.Columns.Add("temps", "Temps");
            grid.Columns["temps"].Width = 80;
            grid.Columns["temps"].DataPropertyName = "temps";
            grid.Columns["temps"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;

            grid.RuptureCalculationColumnsList = new List<MercatorUi.GridPro.DataGridViewColumnForRuptureCalculation>();
            grid.RuptureCalculationColumnsList.Add(new MercatorUi.GridPro.DataGridViewColumnForRuptureCalculation(grid.Columns["temps"], MercatorUi.GridPro.RuptureCalculations.Sum, grid.Columns["titre"]));

            MercatorUi._BaseClasses.TimerOneShot timer = new MercatorUi._BaseClasses.TimerOneShot(timer_Tick, grid);
        }

        void timer_Tick(object sender, EventArgs e)
        {
            MercatorUi._BaseClasses.TimerOneShot timer = (MercatorUi._BaseClasses.TimerOneShot)sender;
            MercatorUi.GridPro.DataGridViewXPro grid = (MercatorUi.GridPro.DataGridViewXPro)timer.Tag;
            grid.PlaceRupture(grid.Columns["titre"]);
        }


    }
}