none
generation de matricule c#

    Question

  • bonjour,

    je voudrais crée une simple application qui permet de généré un matricule par incrémentation.

    par exemple avoir un matricule 00000a qui décompte successivement 00001a et ainsi de suite jusqu’à 99999a qui deviendra 00000b jusqu’à l’épuisement du code.

    je sais pas comment m'y prendre.

    merci


    Cardinal dev

    jeudi 14 juillet 2016 13:16

Réponses

  • La fonction renvoie une string, au lieu de faire appelle ici à Console.WriteLine, vous mettez la fonction dans le code de votre Form :

     private string GetNextCode(string sLastCode)
        {
            if ( String.IsNullOrEmpty(sLastCode) || sLastCode == "99999z" )
                return "00000a";
    
            // Suivant
            string sNextCode = string.Empty;
    
            if (Convert.ToInt32(sLastCode.Substring(0, 5)) == 99999)
                sNextCode = "00000" + (((char)((int)sLastCode[5])=='z') ? 'a' : (char)((int)sLastCode[5]+1));
            else
                sNextCode = (Convert.ToInt32(sLastCode.Substring(0,5))+1).ToString("00000") + (char)((int)sLastCode[5]);
    
            return sNextCode;
        }
    

    Et votre label :

    string code = "00000a";
    
    code = GetNextCode(code);
    
    Label1.Text = code;

    Cordialement,

    jeudi 14 juillet 2016 17:08
  • Quel est la valeur initiale de label1 ?

    Si la valeur est "label1" , c'est normal que ça crash car ce n'est pas le format attendu (à vous de rajouter les modifications nécessaires).

    Cordialement,

    jeudi 21 juillet 2016 10:32

Toutes les réponses

  • Bonjour philippe gerard,

    Il suffit de créer une fonction qui renvoie le prochain en faisant les bon check, notez que dans ce cas, la fonction GetNextCode renvoie 00000a si le code donné est 99999z.

    using System;
    
    class Program
    {
        public static void Main(string[] args)
        {
            string code = "00000a";
            while (code != "9999z")
            {
                System.Console.WriteLine(code);
                code = GetNextCode(code);
            }
            
        }
    
        public static string GetNextCode(string sLastCode)
        {
            if ( String.IsNullOrEmpty(sLastCode) || sLastCode == "99999z" )
                return "00000a";
    
            // Suivant
            string sNextCode = string.Empty;
    
            if (Convert.ToInt32(sLastCode.Substring(0, 5)) == 99999)
                sNextCode = "00000" + (((char)((int)sLastCode[5])=='z') ? 'a' : (char)((int)sLastCode[5]+1));
            else
                sNextCode = (Convert.ToInt32(sLastCode.Substring(0,5))+1).ToString("00000") + (char)((int)sLastCode[5]);
    
            return sNextCode;
        }
    }

    Cordialement,

    jeudi 14 juillet 2016 13:39
  • merci bien. Mais le code est en application console... or je suis en Windows form pour le moment.

    j'ai un label qui reçois le matricule et un bouton qui exécute la commande comment adapté votre programme console en application Windows form ?


    Cardinal dev

    jeudi 14 juillet 2016 15:09
  • La fonction renvoie une string, au lieu de faire appelle ici à Console.WriteLine, vous mettez la fonction dans le code de votre Form :

     private string GetNextCode(string sLastCode)
        {
            if ( String.IsNullOrEmpty(sLastCode) || sLastCode == "99999z" )
                return "00000a";
    
            // Suivant
            string sNextCode = string.Empty;
    
            if (Convert.ToInt32(sLastCode.Substring(0, 5)) == 99999)
                sNextCode = "00000" + (((char)((int)sLastCode[5])=='z') ? 'a' : (char)((int)sLastCode[5]+1));
            else
                sNextCode = (Convert.ToInt32(sLastCode.Substring(0,5))+1).ToString("00000") + (char)((int)sLastCode[5]);
    
            return sNextCode;
        }
    

    Et votre label :

    string code = "00000a";
    
    code = GetNextCode(code);
    
    Label1.Text = code;

    Cordialement,

    jeudi 14 juillet 2016 17:08
  • j'ai essayé le code mais ça ne fait que 00001a et ça n'avance plus.

    je comprend pas


    Cardinal dev

    jeudi 14 juillet 2016 18:39
  • Il faut faire une boucle pour que cela avance, la fonciton ne fait que renvoyer la matricule suivante

    Cordialement,

    jeudi 14 juillet 2016 19:58
  • j'ai essayé avec des boucles Do..while/ for.

    mais rien ne va...je sais pas si je m'y suis mal pris.


    Cardinal dev

    vendredi 15 juillet 2016 11:54
  • Comment faites-vous ? Montrez le code en question.

    Cordialement,

    vendredi 15 juillet 2016 13:51
  • dans le bouton j'ai mis ce code:

    do
                {
                   
                        string code = "00000a";

                        code = GetNextCode(code);

                        label1.Text = code;
                   
                }

                while (label1.Text == "99999z"); 


    Cardinal dev

    vendredi 15 juillet 2016 15:18
  • mettez le string code = "00000a" avant la boucle (avant le do {), parce qu'ici ce qu'il se passe c'est qu'à chaque fois que nous rentrons dans la boucle, code est remis systématiquement à 00000a.

    Cordialement,

    vendredi 15 juillet 2016 17:02
  • bonjour,

    c'est bizarre. mais le code reste toujours à 00001a et n'avance plus.


    Cardinal dev

    samedi 16 juillet 2016 09:08
  • La condition du while est mauvaise, en vrai il ne passe qu'une seule fois dans la boucle, mettez != au lieu de ==.

    Cordialement,

    samedi 16 juillet 2016 13:41
  • salut,

    en le faisant le bouton reste enfoncé (c'est a dire comme si c'etait appuyé) et tout reste figé


    Cardinal dev

    mercredi 20 juillet 2016 00:07
  • C'est normal, la boucle est assez longue (et bloquante) pour aller de 00000a à 99999z. Rendez votre programme multi-thread.

    Cordialement,


    mercredi 20 juillet 2016 07:38
  • véritablement je ne comprends pas...pouvez vous bien m'expliquer cette étape

    Cardinal dev

    mercredi 20 juillet 2016 11:14
  • Le but est de conserver l'UI réactive pendant qu'un opération qui prend du temps et des ressources tourne en même temps. Pour ce faire, il faut passer par du multi-threading. Cela signifie que au minimum deux threads de code fonctionneraient en parallèle. L'un des deux gérerai l'UI (la Form) et le deuxième s'occuperai du traitement des données. dans votre cas, votre boucle s'exécute dans le thread UI, donc l'interface est "bloquée" tant que la boucle n'est pas finie.

    Pour faciliter les choses, en Windows Forms vous avez le composant BackgroundWorker qui permet simplement de lancer une opération dans un nouveau thread.

    Je vous conseille de lire ce petit tutoriel pour bien comprendre l'intérêt du BackgroundWorker.

    Merci d'avance pour votre retour,

    Cordialement,

    mercredi 20 juillet 2016 11:31
  • voila , j'ai ajouter le background worker j'ai ajouter dans le background worker ce code ci:

    string code = "00000a";
    
                do
                {
    
    
                    code = GetNextCode(code);
    
                    label1.Text = code;
    
                }
    
                while (label1.Text != "99999z"); 

    et dans le bouton :

    backgroundWorker1.RunWorkerAsync();

    mais j'ai cette erreur :


    Cardinal dev

    mercredi 20 juillet 2016 14:32
  • C'est normal, le thread n'appartient plus à l'UI, du coup vous ne pouvez pas atteindre aussi facilement les éléments graphiques, il existe des solutions, en voici une ci-dessous (ce n'est surement pas la meilleure mais suffit amplement ici) :

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { for (int i = 0; i < 1000; i++) { label1.Invoke((MethodInvoker)delegate { label1.Text = i.ToString(); }); }

    }

    Dans le cas de votre code, cela donnerai :

    [...]
    
    code = GetNextCode(code);
    
    label1.Invoke((MethodInvoker)delegate
                    {
                        label1.Text = code;
                    });
    
    [...]

    Cordialement,


    mercredi 20 juillet 2016 15:22
  • ok le code marche, mais il s’exécute automatiquement jusqu'a la fin du matricule c'est a dire 99999z.

    je suppose que c'est un problème de boucle parce que je veut que le matricule s’exécute une fois a chaque appuie sur le bouton par exemple:

    00001a ensuite 00002a etc...


    Cardinal dev

    mercredi 20 juillet 2016 15:49
  • La boucle c'était pour vous montrer que la fonction marchais bien, sinon pas besoin de multi-thread alors :

    private monButton_Click(object sender, EventArgs e)
    {
        string code = label1.Text;
        code = GetNextCode(code);
        label1.Text = code;
    }

    Cordialement,

    mercredi 20 juillet 2016 20:14
  • bonjour,

    en utilisant ce code j'ai cette erreur:


    Cardinal dev

    jeudi 21 juillet 2016 10:30
  • Quel est la valeur initiale de label1 ?

    Si la valeur est "label1" , c'est normal que ça crash car ce n'est pas le format attendu (à vous de rajouter les modifications nécessaires).

    Cordialement,

    jeudi 21 juillet 2016 10:32
  • merci j'ai corrigé....

    Cardinal dev

    jeudi 21 juillet 2016 11:25