Een kolom "Nettoprijs" toevoegen in het object ArtFou

0000002022     -      25-06-2015

In de legacy-versie omvatte het rooster van het tabblad "Leveranciers" van de fiche "Artikels" een kolom "Nettoprijs". Deze kolom, die altijd voorkwam omdat ze voorzien was in het "vaste deel" van het programma, werd echter weinig gebruikt en dateerde nog uit de tijd dat het niet mogelijk was om kolommen toe te voegen aan de roosters. Om die redenen is ze niet meer overgenomen bij de ontwikkeling van Mercator Aruba. Wenst u deze kolom toch toe te voegen, dan kan dat heel eenvoudig via een customizer van het informatiebestand "Artikels": SigStock. Deze implementeert de volgende 2 interfaces:

Het basisprincipe van deze programmering bestaat erin om aan het rooster een kolom toe te voegen die niet gelinkt is aan gegevens. Dat gebeurt via het event AfterColumnsCreated. De cellen van deze kolom zullen ingevuld worden in functie van de behoeften via het event CellFormatting van het rooster. Wij hoeven dan nog enkel het event CellValidated te beheren bij het verlaten van de prijs- en kortingcellen, zodat de nettoprijs voor de actieve lijn wordt herberekend.

De code ziet er als volgt uit:

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

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

        public void FormLoadCustomize(System.Windows.Forms.Form WindowsForm)
        {
            MercatorUi.Forms.Sig.SigForm sigForm = (MercatorUi.Forms.Sig.SigForm)WindowsForm;
            List<Control> l = sigForm.FindMovableControlsByType(typeof(MercatorUi.Forms.Sig.SigGrids.ArtFou));
            if (l.Count == 0)
                return;
            MercatorUi.Forms.Sig.SigGrids.ArtFou artFou = (MercatorUi.Forms.Sig.SigGrids.ArtFou)l[0];
            artFou.AfterColumnsCreated += new MercatorUi.MovableControls.MovableGrid.AfterColumnsCreatedHandler(Artfou_AfterColumnsCreated);
            artFou.Grid.CellFormatting += new DataGridViewCellFormattingEventHandler(Artfou_CellFormatting);
            artFou.Grid.CellValidated += new DataGridViewCellEventHandler(Artfou_CellValidated);
        }

        public void FormClosedCustomize(System.Windows.Forms.Form WindowsForm)
        {
            MercatorUi.Forms.Sig.SigForm sigForm = (MercatorUi.Forms.Sig.SigForm)WindowsForm;
            List<Control> l = sigForm.FindMovableControlsByType(typeof(MercatorUi.Forms.Sig.SigGrids.ArtFou));
            if (l.Count == 0)
                return;
            MercatorUi.Forms.Sig.SigGrids.ArtFou artFou = (MercatorUi.Forms.Sig.SigGrids.ArtFou)l[0];
            artFou.AfterColumnsCreated -= new MercatorUi.MovableControls.MovableGrid.AfterColumnsCreatedHandler(Artfou_AfterColumnsCreated);
            artFou.Grid.CellFormatting -= new DataGridViewCellFormattingEventHandler(Artfou_CellFormatting);
            artFou.Grid.CellValidated -= new DataGridViewCellEventHandler(Artfou_CellValidated);
        }

        private void Artfou_AfterColumnsCreated(Object sender, EventArgs e) // De kolom "Nettoprijs" toevoegen
        {
            MercatorUi.Forms.Sig.SigGrids.ArtFou artFou = (MercatorUi.Forms.Sig.SigGrids.ArtFou)sender;
            artFou.Grid.Columns.Add("prix_net", _Divers.Iif_langue(Globals.Langue, "Net Pr.", "Nettoprijs", "Prix net"));
            artFou.Grid.Columns["prix_net"].Width = 85;
            artFou.Grid.Columns["prix_net"].ReadOnly = true;
            artFou.Grid.Columns["prix_net"].DefaultCellStyle.ForeColor = System.Drawing.Color.Gray;
            artFou.Grid.Columns["prix_net"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
            // Deze kolom is bewust niet gelinkt aan een DataPropertyName.
            // Ze zal worden berekend via het event CellFormatting van het rooster.

        }

        private void Artfou_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            DataGridView grid = (DataGridView)sender;
            if ((e.ColumnIndex > -1) && (e.RowIndex > -1) && (grid.Columns[e.ColumnIndex].Name == "prix_net") && grid.Columns.Contains("prix") && grid.Columns.Contains("remise") && grid.Columns.Contains("n_dec"))
                refreshPrixNetCell(grid, e.RowIndex, e);
        }

        private void refreshPrixNetCell(DataGridView grid, int rowIndex, DataGridViewCellFormattingEventArgs e)
        {
            double prix = System.Convert.ToDouble(grid.Rows[rowIndex].Cells["prix"].Value);
            double remise = System.Convert.ToDouble(grid.Rows[rowIndex].Cells["remise"].Value);
            double remise2 = 0;
            if (grid.Columns.Contains("remise2"))
                remise2 = System.Convert.ToDouble(grid.Rows[rowIndex].Cells["remise2"].Value);
            double remise3 = 0;
            if (grid.Columns.Contains("remise3"))
                remise3 = System.Convert.ToDouble(grid.Rows[rowIndex].Cells["remise3"].Value);
            double remise4 = 0;
            if (grid.Columns.Contains("remise4"))
                remise4 = System.Convert.ToDouble(grid.Rows[rowIndex].Cells["remise4"].Value);
            int n_dec = System.Convert.ToInt32(grid.Rows[rowIndex].Cells["n_dec"].Value);
            string mask = "# ### ### ##0" + Api.Iif(n_dec > 0, ".", "") + Api.Replicate("0", n_dec);
            string prix_net = string.Format("{0:" + mask + "}", Math.Round(prix * ((100 - remise) / 100) * ((100 - remise2) / 100) * ((100 - remise3) / 100) * ((100 - remise4) / 100), 2));
            if (e != null)
                e.Value = prix_net; // Men komt van Artfou_CellFormatting.
            else
                grid.Rows[rowIndex].Cells["prix_net"].Value = prix_net; // Men komt van Artfou_CellValidated.
        }

        private void Artfou_CellValidated(object sender, DataGridViewCellEventArgs e) // Als men de content wijzigt van prijs, korting ... -> moet men de nettoprijs op deze lijn aanpassen.
        {
            DataGridView grid = (DataGridView)sender;
            if ((e.ColumnIndex > -1) && (e.RowIndex > -1) && ((grid.Columns[e.ColumnIndex].Name == "prix") || (grid.Columns[e.ColumnIndex].Name == "remise") || (grid.Columns[e.ColumnIndex].Name == "remise2") || (grid.Columns[e.ColumnIndex].Name == "remise3") || (grid.Columns[e.ColumnIndex].Name == "remise4")))
                refreshPrixNetCell(grid, e.RowIndex, null);
        }


    }
}

Andere module met betrekking tot Artfou: Een kolom schrappen in het object ArtFou