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

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

0000002605     -      23/10/2015

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.

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).

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. Par contre, 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;


namespace Billing
{
    public class Customizer : MercatorUi.ICustomizers.IBillingEngineCreated, MercatorUi.ICustomizers.IBillingEngineClosed
    {

        public void BillingEngineCreated(MercatorUi.Engine.Gescom.BillingEngine BillingEngine)
        {
            BillingEngine.BillingFormLoaded += new EventHandler(BillingEngine_BillingFormLoaded);
        }

        public void BillingEngineClosed(MercatorUi.Engine.Gescom.BillingEngine BillingEngine)
        {
            BillingEngine.BillingFormLoaded -= new EventHandler(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 != "") && !itemExistsInList(l, 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 += new DataGridViewEditingControlShowingEventHandler(Grid_EditingControlShowing);
            }
        }

        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 != "")
                {
                    string s_usages = MercatorController.xFunctions.xLookUpString("STOCK", "S_ID", id_article, "S_USAGES");
                    foreach (string s in s_usages.Split(new char[2] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries))
                    {
                        l.Add(new MercatorUi._BaseClasses.MercatorComboItem(s, s));
                        if (!itemExistsInList(listOnCol, 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;
            }
        }

        private bool itemExistsInList(BindingList<MercatorUi._BaseClasses.MercatorComboItem> l, string s)
        {
            foreach (MercatorUi._BaseClasses.MercatorComboItem item in l)
            {
                if (item.Id == s)
                    return true;
            }
            return false;
        }
    }
}