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

Ajouter une colonne modifiable dans la grille Dispo

0000002075     -      06/06/2013

L'exemple de code ci-dessous montre comment ajouter une colonne modifiable dans la grille dispo. Cette colonne, dans l'exemple, permet de gérer une localisation au niveau des dépôts des différents magasins.

La programmation illustrée ici est réalisée sur base d'un customizer SigStock qui implémente les interfaces suivantes :

Le code de ce customizer s'établit comme suit :

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

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

        public string StringUpdate(string StringToModify) //modification de la requête de la grille du disponible pour tenir compte d'une nouvelle colonne.
        {
            if (Api.StrExtract(StringToModify, "<ID>", "</ID>") == "STOCKDISPO") // ceci permet de ne modifier que la requête de la grille de disponible, sans modifier les requêtes des autres grilles du signalétique article
            {
                StringToModify = StringToModify.Replace("dispo.stockmax,", "dispo.stockmax,dispo.loc,dispo.loc as loc_old,");
                StringToModify = StringToModify.Replace("sum(stockmax),", "sum(stockmax),'','',");
            }
            return StringToModify;
        }
        
        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.StockDispo));
            if (l.Count == 0)
                return;
            MercatorUi.Forms.Sig.SigGrids.StockDispo stockDispo = (MercatorUi.Forms.Sig.SigGrids.StockDispo)l[0];
            stockDispo.AfterColumnsCreated += new MercatorUi.MovableControls.MovableGrid.AfterColumnsCreatedHandler(stockDispo_AfterColumnsCreated); //Pour ajouter la nouvelle colonne
            stockDispo.AfterWrite += new MercatorUi.MovableControls.MovableGrid.AfterWriteHandler(stockDispo_AfterWrite); //Pour aller écrire dans la DB les modifications
        }

        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.StockDispo));
            if (l.Count == 0)
                return;
            MercatorUi.Forms.Sig.SigGrids.StockDispo stockDispo = (MercatorUi.Forms.Sig.SigGrids.StockDispo)l[0];
            stockDispo.AfterColumnsCreated -= new MercatorUi.MovableControls.MovableGrid.AfterColumnsCreatedHandler(stockDispo_AfterColumnsCreated);
            stockDispo.AfterWrite -= new MercatorUi.MovableControls.MovableGrid.AfterWriteHandler(stockDispo_AfterWrite);
        }

        private void stockDispo_AfterColumnsCreated(Object sender, EventArgs e) // ajouter la colonne "Localisation"
        {
            MercatorUi.Forms.Sig.SigGrids.StockDispo stockDispo = (MercatorUi.Forms.Sig.SigGrids.StockDispo)sender;
            stockDispo.Grid.Columns.Add("loc", _Divers.Iif_langue(Globals.Langue, "Localisation", "Localisation", "Localisation"));
            stockDispo.Grid.Columns["loc"].Width = 85;
            stockDispo.Grid.Columns["loc"].ReadOnly = false;
            stockDispo.Grid.Columns["loc"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
            stockDispo.Grid.Columns["loc"].DataPropertyName = "loc";
            stockDispo.Grid.Columns.Add("loc_old", "");
            stockDispo.Grid.Columns["loc_old"].Width = 0;
            stockDispo.Grid.Columns["loc_old"].ReadOnly = true;
            stockDispo.Grid.Columns["loc_old"].DataPropertyName = "loc_old";
            stockDispo.Grid.Columns["loc_old"].Visible = false;
        }

        private void stockDispo_AfterWrite(object sender, EventArgs e)//Pour aller écrire dans la DB les modifications sur la nouvelle colonne
        {
            MercatorUi.Forms.Sig.SigGrids.StockDispo stockDispo = (MercatorUi.Forms.Sig.SigGrids.StockDispo)sender;

            MercatorUi.Forms.Sig.SigForm formStock = (MercatorUi.Forms.Sig.SigForm)stockDispo.Form;
            if (stockDispo.LastIdFilled == formStock.DataSourceRow["s_id"].ToString())
            {
                foreach (DataGridViewRow row in stockDispo.Grid.Rows)
                {
                    if (row.Cells["loc"].Value.ToString().Trim() != row.Cells["loc_old"].Value.ToString().Trim())
                    {
                        SqlCommand oCommand = new SqlCommand("update dispo set loc = @loc where id_stock = @id_stock and id_magasin = @id_magasin");
                        oCommand.Parameters.Add(new SqlParameter("@id_stock", SqlDbType.Char)).Value = formStock.DataSourceRow["s_id"].ToString();
                        oCommand.Parameters.Add(new SqlParameter("@id_magasin", SqlDbType.Char)).Value = row.Cells["id"].Value;
                        oCommand.Parameters.Add(new SqlParameter("@loc", SqlDbType.Char)).Value = row.Cells["loc"].Value;
                        Api.SqlExec(Globals.RepData, oCommand);
                    }
                }
            }
        }
    }
}