Een wijzigbare kolom toevoegen in het Dispo-rooster

0000002075     -      06-06-2013

De onderstaande voorbeeldcode laat zien hoe een wijzigbare kolom wordt toegevoegd in het beschikbaarheidsrooster. Met deze kolom uit het voorbeeld kan een lokalisatie worden beheerd op het niveau van de magazijnen van de verschillende winkels.

De hier geïllustreerde programmering wordt gerealiseerd op basis van een SigStock-customizer die de volgende interfaces implementeert:

De code van deze customizer 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;
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) //Wijziging van de opdracht van het beschikbaarheidsrooster om rekening te houden met een nieuwe kolom.
        {
             if (Api.StrExtract(StringToModify, "<ID>" , "</ID>" ) == "STOCKDISPO" ) // Dit laat toe enkel de opdracht van het beschikbaarheidsrooster te wijzigen, en niet de opdrachten van de andere roosters van het informatiebestand "Artikels" 
            {
                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) // De kolom "Lokalisatie" toevoegen
        {
            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) // Om de wijzigingen aan de nieuwe kolom in de DB in te voeren
        {
            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);
                    }
                }
            }
        }
    }
}