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 la liste de parcours des clients, mettre en rouge les clients dont le solde comptable est supérieur à une valeur

0000001980     -      31/10/2013

L'exemple repris ci-dessous permet, dans la liste de parcours des fiches clients, de mettre en rouge les clients dont le solde comptable est supérieur à une valeur (5000 EUR dans notre exemple). Ce module se fait par la réalisation d'un customizer BrowseCli, qui implémente les interfaces suivantes :

  • IStringUpdater : pour modifier la requête SQL qui, par défaut, ne prend pas en compte le champ "solde"
  • IFormLoadCustomizer : pour ajouter un évènement CellFormatting sur la grille ainsi qu'une colonne invisible contenant le solde
  • IFormClosedCustomizer : pour retirer l'évènement créé ci-dessus
  • IFormGridCustomizer : pour ajouter une colonne dans la grille de l'écran

Notons qu'il est réellement nécessaire d'ajouter une colonne "solde" dans la grille. En effet, nous pourrions penser qu'il serait possible de connaître le solde d'une ligne en adressant directement la DataTable qui est le DataSource de la grille (par cette référence : (DataTable)dataGridView.DataSource). Mais l'utilisateur peut changer l'ordre des lignes de la grille en cliquant dans l'entête de chaque colonne et il peut encore filtrer. Dans ces 2 cas, l'ordre et l'index des lignes dans la grille ne correspond plus à l'ordre et l'index des lignes dans la DataTable. En travaillant uniquement en référençant des cellules dans la grille, le problème ne se pose pas.

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

namespace BrowseCli
{
    public class Customizer :
        MercatorUi.ICustomizers.IStringUpdater,
        MercatorUi.ICustomizers.IFormLoadCustomizer,
        MercatorUi.ICustomizers.IFormClosedCustomizer,
        MercatorUi.ICustomizers.IFormGridCustomizer
    {

        /*
         * Cette première méthode est l'implémentation de l'interface IStringUpdater.
         * Elle permet de modifier directement la requête SQL que Mercator se propose d'exécuter par défaut.
         * On ajoute simplement le champ C_SOLDE dans la liste de champs du select de la requête
         */

        public string StringUpdate(string StringToModify)
        {
            StringToModify = StringToModify.Replace(" from CLI", ",C_SOLDE from CLI");
            return StringToModify;
        }
        /*
         * Cette deuxième méthode est l'implémentation de l'interface IFormLoadCustomizer.
         * Comme cette méthode reçoit en paramètre un Form (fenêtre de base - car on peut utiliser cette interface pour divers écrans),
         * il faut d'abord effectuer un cast Form -> SigBrowseForm
         * Ce code ajoute un évènement CellFormatting sur le dataGridView.
         */

        public void FormLoadCustomize(Form WindowsForm)
        {
            MercatorUi.Forms.Sig.SigBrowseForm SigBrowseForm = (MercatorUi.Forms.Sig.SigBrowseForm)WindowsForm;
            SigBrowseForm.dataGridView.CellFormatting += new DataGridViewCellFormattingEventHandler(dataGridView_CellFormatting);
        }

        public void FormClosedCustomize(Form WindowsForm)
        {
            MercatorUi.Forms.Sig.SigBrowseForm SigBrowseForm = (MercatorUi.Forms.Sig.SigBrowseForm)WindowsForm;
            SigBrowseForm.dataGridView.CellFormatting -= new DataGridViewCellFormattingEventHandler(dataGridView_CellFormatting);
        }

        /*
         * Cette méthode est l'implémentation de l'interface IFormGridCustomizer
         * Elle ajoute la colonne c_solde au datagridview
         */

        public void FormGridCustomize(Form WindowsForm)
        {
            MercatorUi.Forms.Sig.SigBrowseForm SigBrowseForm = (MercatorUi.Forms.Sig.SigBrowseForm)WindowsForm;
            SigBrowseForm.dataGridView.Columns.Add("c_solde", "");
            SigBrowseForm.dataGridView.Columns["c_solde"].DataPropertyName = "c_solde";
            SigBrowseForm.dataGridView.Columns["c_solde"].Visible = false;
        }



        void dataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            DataGridView dataGridView = (DataGridView)sender;
            if (dataGridView.Columns.Contains("c_solde") // lorsque l'on rafraîchit la grille, les colonnes sont recréées. Pendant ce temps, la colonne n'existe plus.
            && (dataGridView.Rows[e.RowIndex].Cells["c_solde"].Value != DBNull.Value)) // on vérifie que ce n'est pas une ligne de rupture qui ne contient pas de valeur
            {
                double solde = System.Convert.ToDouble(dataGridView.Rows[e.RowIndex].Cells["c_solde"].Value);
                if (solde < -5000) // en négatif, car un solde débiteur est négatif
                    e.CellStyle.ForeColor = Color.Red;
            }
        }

    }
}