Dans une grille de saisie de vente, ajouter un déroulant (combobox) dont les valeurs proviennent de la fiche article

0000002605     -      15/12/2024

Le présent customizer permet, dans une grille de saisie de vente, d'ajouter un déroulant (combobox) dont les valeurs proviennent de la fiche article. Ceci offre donc un déroulant dont les valeurs disponibles changent d'articles en articles.

Les valeurs disponibles seront stockées dans un champ S_USAGES varchar(MAX) de la table STOCK.

alter table STOCK add S_USAGES vharchar(MAX) not null default ''

Dans la fiche article, les valeurs disponibles sont encodées dans ce champ mémo. Elles sont séparées par un retour à la ligne. (Chaque ligne = une option disponible).

Dans la table LIGNES_V, il faut ajouter le champ USAGE char(200) (ou toute autre longueur au moins égale à la longueur de la plus longue option qui sera encodée).

 

alter table LIGNES_V add USAGE char(200) not null default ''

Le customizer repris ci-dessous montre le code à mettre en place dans un customizer Billing. Le principe est que la liste au niveau de la colonne doit contenir tous les items possibles. En revanche, via l'évènement EditingControlShowing de la grille, lorsque le déroulant est réellement affiché en tant que contrôle d'édition, on affiche une liste d'éléments propres à l'article en cours.

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


namespace Billing
{
    public class Customizer : MercatorUi.ICustomizers.IBillingEngineCreated, MercatorUi.ICustomizers.IBillingEngineClosed
    {
        public void BillingEngineCreated(MercatorUi.Engine.Gescom.BillingEngine billingEngine)
        {
            billingEngine.BillingFormLoaded += BillingEngine_BillingFormLoaded;
        }

        public void BillingEngineClosed(MercatorUi.Engine.Gescom.BillingEngine billingEngine)
        {
            billingEngine.BillingFormLoaded -= BillingEngine_BillingFormLoaded;
        }

        void BillingEngine_BillingFormLoaded(object sender, EventArgs e)
        {
            MercatorUi.Engine.Gescom.BillingEngine billingEngine = (MercatorUi.Engine.Gescom.BillingEngine)sender;
            if (billingEngine.BillingForm.LinesEditor != null)
            {
                BindingList<MercatorUi._BaseClasses.MercatorComboItem> l = new BindingList<MercatorUi._BaseClasses.MercatorComboItem>();
                foreach (DataRow dr in billingEngine.LIGNES.Rows)
                {
                    string usage = dr["usage"].ToString();
                    if ((usage != "") && !l.Any(p => p.Id == usage))
                        l.Add(new MercatorUi._BaseClasses.MercatorComboItem(usage, usage));
                }
                DevComponents.DotNetBar.Controls.DataGridViewComboBoxExColumn comboCol = new DevComponents.DotNetBar.Controls.DataGridViewComboBoxExColumn();
                comboCol.Name = "usage";
                comboCol.HeaderText = "Usage";
                comboCol.DataPropertyName = "usage";
                comboCol.DisplayMember = "Description";
                comboCol.ValueMember = "Id";
                comboCol.DataSource = l;
                comboCol.Width = 100;
                comboCol.DropDownStyle = ComboBoxStyle.DropDownList;
                billingEngine.BillingForm.LinesEditor.Grid.Columns.Add(comboCol);
                billingEngine.BillingForm.LinesEditor.Grid.EditingControlShowing += Grid_EditingControlShowing;
                billingEngine.BillingForm.LinesEditor.Grid.Disposed += Grid_Disposed;
            }
        }

        private void Grid_Disposed(object sender, EventArgs e)
        {
            MercatorUi.GridPro.DataGridViewXPro grid = (MercatorUi.GridPro.DataGridViewXPro)sender;
            grid.EditingControlShowing -= Grid_EditingControlShowing;
            grid.Disposed -= Grid_Disposed;
        }

        void Grid_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
            MercatorUi.GridPro.DataGridViewXPro grid = (MercatorUi.GridPro.DataGridViewXPro)sender;
            if ((e.Control is DevComponents.DotNetBar.Controls.ComboBoxEx) && (grid.Columns[grid.CurrentCell.ColumnIndex].Name == "usage"))
            {
                DevComponents.DotNetBar.Controls.DataGridViewComboBoxExColumn comboCol = (DevComponents.DotNetBar.Controls.DataGridViewComboBoxExColumn)grid.Columns[grid.CurrentCell.ColumnIndex];
                BindingList<MercatorUi._BaseClasses.MercatorComboItem> listOnCol = (BindingList<MercatorUi._BaseClasses.MercatorComboItem>)comboCol.DataSource;


                DevComponents.DotNetBar.Controls.ComboBoxEx combo = (DevComponents.DotNetBar.Controls.ComboBoxEx)e.Control;
                string id_article = grid.CurrentRow.Cells["id_article"].Value.ToString();
                List<MercatorUi._BaseClasses.MercatorComboItem> l = new List<MercatorUi._BaseClasses.MercatorComboItem>();
                if (id_article != "")
                {
                    MercatorUi.Forms.Billing.BillingForm billingForm = (MercatorUi.Forms.Billing.BillingForm)grid.FindForm();
                    foreach (string s in billingForm.BillingEngine.StockRecords[id_article].S_USAGES.Split(new char[2] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries))
                    {
                        l.Add(new MercatorUi._BaseClasses.MercatorComboItem(s, s));
                        if (!listOnCol.Any(p => p.Id == s))
                            listOnCol.Add(new MercatorUi._BaseClasses.MercatorComboItem(s, s));
                    }
                    l.Add(new MercatorUi._BaseClasses.MercatorComboItem("", "")); // ajouter un élément vide dans le combo
                }
                combo.DataSource = l;
            }
        }
    }
}


Cookies fonctionnels : Cookies nécessaires à l'utilisation du site et cookies de préférence. Ils ne contiennent aucune donnée à caractère personnel. (En savoir plus)

Cookies statistiques : Captation de statistiques liées aux comportements des internautes. (En savoir plus)

Cookies marketing : Pour effectuer le suivi des visiteurs au travers des sites web, à des fins publicitaires. (En savoir plus)