In de klantenbladerlijst de klanten in rood weergeven waarvan het boekhoudkundige saldo meer bedraagt dan een bepaalde waarde

0000001980     -      31-10-2013

Het onderstaande voorbeeld laat toe om in de klantenbladerlijst die klanten in rood weer te geven waarvan het boekhoudkundige saldo meer bedraagt dan een bepaalde waarde (5000 EUR in ons voorbeeld). Deze module wordt verkregen door de realisatie van een customizer BrowseCli, die de volgende interfaces implementeert:

  • IStringUpdater: voor het wijzigen van de SQL-opdracht die standaard geen rekening houdt met het veld "Saldo";
  • IFormLoadCustomizer: voor het toevoegen van een CellFormatting-event in het rooster, alsook een onzichtbare kolom met het saldo;
  • IFormClosedCustomizer: voor het verwijderen van het hierboven gecreĆ«erde event;
  • IFormGridCustomizer: voor het toevoegen van een kolom in het schermrooster.

Merk op dat het echt nodig is om een kolom "Saldo" toe te voegen in het rooster. We zouden immers kunnen denken dat het mogelijk zou zijn om het saldo van een lijn te kennen door rechtstreeks de DataTable te openen die de DataSource van het rooster vormt (via deze verwijzing: (DataTable)dataGridView.DataSource). Maar de gebruiker kan de volgorde van de lijnen in het rooster veranderen door te klikken in de hoofding van iedere kolom, en hij kan ook filters toepassen. In die 2 gevallen stemmen de volgorde en de index van de lijnen in het rooster niet langer overeen met de volgorde en de index van de lijnen in de DataTable. Door enkel te werken met verwijzingen naar cellen in het rooster, stelt dit probleem zich niet.

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
    {

        /*
         * Deze eerste methode is de implementatie van de interface IStringUpdater.
          * Hiermee kunt u rechtstreeks de SQL-opdracht wijzigen die Mercator standaard voorstelt voor uitvoering.
         * Men voegt gewoon het veld C_SOLDE toe in de lijst met velden van de select van de opdracht
         */

        public string StringUpdate(string StringToModify)
        {
            StringToModify = StringToModify.Replace(" from CLI", ",C_SOLDE from CLI");
            return StringToModify;
        }
        /*
         * Deze tweede methode is de implementatie van de interface IFormLoadCustomizer.
         * Aangezien deze methode een Form als parameter krijgt (basisvenster, want we kunnen deze interface gebruiken voor diverse schermen),
         * moet er eerst een cast Form -> SigBrowseForm worden gerealiseerd.
         * Deze code voegt een CellFormatting-event toe aan het 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);
        }

        /*
         * Deze methode is de implementatie van de interface IFormGridCustomizer
         * Ze voegt de kolom c_solde toe aan het 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") // Bij het vernieuwen van het rooster worden de kolommen opnieuw gecreĆ«erd. In die tussentijd bestaat de kolom niet meer.
            && (dataGridView.Rows[e.RowIndex].Cells["c_solde"].Value != DBNull.Value)) // Men controleert dat het geen scheidingslijn is zonder
            {
                double solde = System.Convert.ToDouble(dataGridView.Rows[e.RowIndex].Cells["c_solde"].Value);
                if (solde < -5000) // negatieve waarde, want een debetsaldo is negatief
                    e.CellStyle.ForeColor = Color.Red;
            }
        }

    }
}