IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Trier des boutons par leurs familles [Débutant]


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Trier des boutons par leurs familles
    Bonjour à tous, j'ai besoin de votre aide, j'ai un projet, c'est de réaliser une application qui permet d'ouvrir n'importe quel fichier txt et de générer des boutons. J'arrive à générer mes boutons à partir d'un fichier mais le problème c'est que je n'arrive pas à les trier par famille.
    mes fichiers txt se présentent sous cette forme :
    9ALOC1160;1;58;9;
    9ALOC580;1;9;9;
    9ALOC70;1;150;9;
    9ALOC780;1;89;9;
    .
    .
    .
    9KIT1170;1;56;9;
    9KIT2_40;1;144;9;
    9KIT80;1;145;9;
    9KIT830;1;30;9;
    9KIT870;1;48;9;
    .
    .
    .
    etc donc voilà mes boutons sont donc en ligne et font exactement pareil que le fichier txt sauf que j'aimerai les ranger par famille (ALOC, KIT sont des familles)
    et les mettre chacun dans panels différents avec un titre pour dire quel est tel famille etc. Etant débutant j'ai bien du mal à faire ça c'est pour cela que je demande votre aide..

    Mon code actuellement qui permet de lire le fichier et de générer les boutons c'est ça :
    Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
     
    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Data;
    using System.IO;
     
    namespace ReadText
    {
        /// <summary>
        /// Summary description for Form1.
        /// </summary>
        public class Form1 : System.Windows.Forms.Form
        {
            private System.Windows.Forms.Button browse;
            private System.Windows.Forms.OpenFileDialog openFile;
            private System.Windows.Forms.TextBox texte2Open;
            private System.Windows.Forms.TextBox text;
            /// <summary>
            /// Required designer variable.
            /// </summary>
            private System.ComponentModel.Container components = null;
     
            public Form1()
            {
                //
                // Required for Windows Form Designer support
                //
                InitializeComponent();
     
                //
                // TODO: Add any constructor code after InitializeComponent call
                //
            }
     
            /// <summary>
            /// Clean up any resources being used.
            /// </summary>
            protected override void Dispose(bool disposing)
            {
                if (disposing)
                {
                    if (components != null)
                    {
                        components.Dispose();
                    }
                }
                base.Dispose(disposing);
            }
     
            #region Windows Form Designer generated code
            /// <summary>
            /// Required method for Designer support - do not modify
            /// the contents of this method with the code editor.
            /// </summary>
            private void InitializeComponent()
            {
                this.browse = new System.Windows.Forms.Button();
                this.texte2Open = new System.Windows.Forms.TextBox();
                this.openFile = new System.Windows.Forms.OpenFileDialog();
     
                this.SuspendLayout();
                // 
                // browse
                // 
                this.browse.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
                this.browse.Location = new System.Drawing.Point(400, 8);
                this.browse.Name = "browse";
                this.browse.TabIndex = 1;
                this.browse.Text = "Recherche";
                this.browse.Click += new System.EventHandler(this.browse_Click);
                // 
                // texte2Open
                // 
                this.texte2Open.Location = new System.Drawing.Point(8, 8);
                this.texte2Open.Name = "texte2Open";
                this.texte2Open.Size = new System.Drawing.Size(384, 20);
                this.texte2Open.TabIndex = 2;
                this.texte2Open.Text = "";
                // 
                // text
                // 
     
                // 
                // Form1
                // 
                this.AutoScaleBaseSize = new System.Drawing.Size(3, 5);
                this.ClientSize = new System.Drawing.Size(480, 253);
                this.Controls.Add(this.text);
                this.Controls.Add(this.texte2Open);
                this.Controls.Add(this.browse);
                this.Name = "Form1";
                this.Text = "Boîte à bouton";
                this.ResumeLayout(false);
     
     
     
     
            }
            #endregion
     
            /// <summary>
            /// The main entry point for the application.
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.Run(new Form1());
            }
     
            private void browse_Click(object sender, System.EventArgs e)
            {
                Panel Bouton = new Panel();
     
                //On initialise les contrôles du Panel 
                Bouton.Location = new Point(56, 180);
                Bouton.Size = new Size(464, 252);
                //Maintenant on donne au Panel une dimension (3D)
                Bouton.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
                Bouton.AutoScroll = true;
                if (openFile.ShowDialog() == DialogResult.OK)
                    texte2Open.Text = openFile.FileName;
                else
                {
                    MessageBox.Show("Erreur : aucun fichier trouvé");
                }
     
                var organes = File.ReadAllLines(@"C:\Users\Essais\Documents\Visual Studio 2010\Projects\Recherche de dossier et lecture de texte\Recherche de dossier et lecture de texte\bin\Debug\Liste.par");
     
     
     
                for (int i = 0; i < organes.Length; i++)
                {
                    Button button = new Button();
     
                    button.Text = organes[i];
                    button.Location = new Point(0, i * button.Size.Width); // On décale à chaque itération
                    //On crée les différents éléments 
     
     
                    //On ajoute le Panel à la page 
                    this.Controls.Add(Bouton);
     
                    //On ajoute pour finir l'objet bouton au Panel
     
                    Bouton.Controls.Add(button);
     
                }
     
            }
     
        }
     
    }
    Je précise que ce ne sont pas les seules familles que l'ont aura du coup il faut que ça s'adapte aux fichiers qu'il va lire

    Voilà je vous remercie de votre temps

  2. #2
    Membre Expert
    Avatar de PixelJuice
    Homme Profil pro
    Ingénieur .NET & Game Designer
    Inscrit en
    Janvier 2014
    Messages
    671
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur .NET & Game Designer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 671
    Par défaut
    Bonsoir,

    Pour ce qui est du tri des familles, cela dépend, ça sera plus ou moins difficile selon tes besoins et la structure du fichier. Si tu peux fournir une liste prédéfinie des familles susceptibles de se trouver dans le fichier, alors pas de soucis, c'est un jeu d'enfant. Si ce n'est pas le cas, il faudra alors isoler chaque famille, créer une liste en conséquent et y mettre chaque ligne y correspondant.

    En ce qui concerne les panels, c'est très, simple, il te suffit de faire la même chose que les boutons mais avec un panel par famille. Je te conseille d'englober le tout dans un FlowLayoutPanel qui range automatiquement son contenu, comme ça tu n'as pas a te tracasser sur le positionnement des différents panels à l'intérieur. Je te conseille aussi, comme je l'ai fait sur ton précédent sujet, de créer un UserControl qui te permettra de faire ça plus proprement et d'avoir un meilleur contrôle sur l'affichage, etc ...

    Si le tri des familles est obscure pour toi, donne nous les informations nécessaires et on pourra te guider, mais là dans l'état difficile de te montrer une quelconque voie.

    Par contre dans ton code, il y a un problème, tu ajoutes le panel autant de fois qu'il y a de boutons

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                    //On ajoute le Panel à la page 
                    this.Controls.Add(Bouton);
    Il faut remonter cette ligne hors de la boucle des boutons . Même si il me semble que la méthode vérifie si le contrôle est déjà présent dans la liste ou non, autant que ça soit propre de ce coté là.

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2009
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Février 2009
    Messages : 155
    Par défaut
    En reprenant rapidement ton code et l'idée du FlowLayoutPanel de PixelJuice :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.IO;
    using System.Text.RegularExpressions;
     
     
    namespace WindowsFormsApp1
    {
        public partial class Form1 : Form
        {
            private System.Windows.Forms.Button browse;
            private System.Windows.Forms.OpenFileDialog openFile;
            private System.Windows.Forms.TextBox texte2Open;
            private System.Windows.Forms.TextBox text;
            /// <summary>
            /// Required designer variable.
            /// </summary>
            private System.ComponentModel.Container components = null;
     
            private FlowLayoutPanel PanelBouton;
     
     
            public Form1()
            {
                //
                // Required for Windows Form Designer support
                //
                InitializeComponent();
     
                //
                // TODO: Add any constructor code after InitializeComponent call
                //
            }
     
            /// <summary>
            /// Clean up any resources being used.
            /// </summary>
            protected override void Dispose(bool disposing)
            {
                if (disposing)
                {
                    if (components != null)
                    {
                        components.Dispose();
                    }
                }
                base.Dispose(disposing);
            }
     
     
     
            #region Windows Form Designer generated code
            /// <summary>
            /// Required method for Designer support - do not modify
            /// the contents of this method with the code editor.
            /// </summary>
            private void InitializeComponent()
            {
                this.browse = new System.Windows.Forms.Button();
                this.texte2Open = new System.Windows.Forms.TextBox();
                this.openFile = new System.Windows.Forms.OpenFileDialog();
     
                this.SuspendLayout();
                // 
                // browse
                // 
                this.browse.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
                this.browse.Location = new System.Drawing.Point(400, 8);
                this.browse.Name = "browse";
                this.browse.TabIndex = 1;
                this.browse.Text = "Recherche";
                this.browse.Click += new System.EventHandler(this.browse_Click);
                // 
                // texte2Open
                // 
                this.texte2Open.Location = new System.Drawing.Point(8, 8);
                this.texte2Open.Name = "texte2Open";
                this.texte2Open.Size = new System.Drawing.Size(384, 20);
                this.texte2Open.TabIndex = 2;
                this.texte2Open.Text = "";
                // 
                // text
                // 
     
                // 
                // Form1
                // 
                this.AutoScaleBaseSize = new System.Drawing.Size(3, 5);
                this.ClientSize = new System.Drawing.Size(480, 253);
                this.Controls.Add(this.text);
                this.Controls.Add(this.texte2Open);
                this.Controls.Add(this.browse);
                this.Name = "Form1";
                this.Text = "Boîte à bouton";
                this.ResumeLayout(false);
            }
            #endregion
     
            /// <summary>
            /// The main entry point for the application.
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.Run(new Form1());
            }
     
            private void browse_Click(object sender, System.EventArgs e)
            {
     
                if (openFile.ShowDialog() == DialogResult.OK)
                    texte2Open.Text = openFile.FileName;
                else
                {
                    MessageBox.Show("Erreur : aucun fichier trouvé");
                    return;
                }
     
                //var organes = File.ReadAllLines(@"C:\Users\Essais\Documents\Visual Studio 2010\Projects\Recherche de dossier et lecture de texte\Recherche de dossier et lecture de texte\bin\Debug\Liste.par");
                var organes = File.ReadAllLines(openFile.FileName);
     
                ArrayList uneListeOrganes = new ArrayList();
                for (int i = 0; i < organes.Length; i++)
                {
                    uneListeOrganes.Add(organes[i]);
                }
                uneListeOrganes.Sort();
     
                string pattern = @"^\d([A-Z]+)\d";
                Regex rgx = new Regex(pattern);
     
                int j = 0;
                int k = -1;
                string oldCat = string.Empty;
     
                foreach (string lg in uneListeOrganes)
                {
                    j++;
                    Match m = rgx.Match(lg);
                    string cat = m.Groups[1].ToString();
     
                    if (cat != oldCat)
                    {
                        k++;
                        PanelBouton = new FlowLayoutPanel();
                        Controls.Add(PanelBouton);
                        PanelBouton.Name = "Panel" + cat;
                        PanelBouton.Location = new Point(50, (200 * k) + 50);
                        PanelBouton.Size = new Size(300, 150);
                        //Maintenant on donne au Panel une dimension (3D)
                        PanelBouton.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
                        PanelBouton.AutoScroll = true;
                    }
                    oldCat = cat;
     
                    Button button = new Button();
                    PanelBouton.Controls.Add(button);
                    button.Width = 140;
                    button.Height = 30;
                    button.Text = lg.ToString();
                }
     
     
            }
        }
     }

    On effectue un tri préalable ce qui permet de traiter un fichier brut comme :

    9TEST100;1;145;9;
    9KIT870;1;48;9;
    9ALOC1160;1;58;9;
    9KIT1170;1;56;9;
    9ALOC580;1;9;9;
    9KIT2_40;1;144;9;
    9ALOC70;1;150;9;
    9TEST101;1;145;9;
    9KIT830;1;30;9;
    9ALOC780;1;89;9;
    9KIT80;1;145;9;
    9TEST102;1;145;9;

    Tout ça est à affiner car l'approche est trop simpliste, d'ailleurs il te reste à traiter l'affichage du titre des panels ; ça ne devrait pas être bien compliqué

  4. #4
    Invité
    Invité(e)
    Par défaut
    Je vous remercie pour votre aide, oui c'est simpliste mais déjà pour mon niveau c'est assez complexe, peux tu m'expliquer un peu le code que tu as fait s'il te plait ? J'ai compris la plus grosse partie mais j'aimerai avoir tes détails s'il te plaît

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2009
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Février 2009
    Messages : 155
    Par défaut
    En parlant d'approche simpliste je faisais référence au mode un peu "bourrin" que j'ai utilisé en injectant le minimum de code nécessaire pour faire tourner ton programme. Ce n'est certainement pas un exemple à donner...
    Car j'imagine que ton projet ne consiste pas seulement à décorer des panels avec un lot de boutons, ces boutons vont bien avoir un rôle ? Alourdir le code principal avec une multitude de lignes de paramétrage de propriétés, de déclarations et d'appels de méthodes va vite le rendre illisible et difficile à maintenir.
    Le C# étant un langage objet, autant en utiliser tout le potentiel. Avant d'aller plus loin dans le codage, effectue une analyse des besoins et adopte une approche objet : les classes et l'héritage de classes ça permet d'écrire facilement du code de qualité.

    Concernant les éléments que j'ai intégrés à ton code il n'y a rien de bien sorcier, mais j'imagine que pour un débutant le Regex et la syntaxe barbare des expressions régulières peuvent dérouter.

    Dans le programme le Regex rgx permet d'extraire le nom de la catégorie (cat = m.Groups[1]) qui correspond à la partie ([A-Z]+) du pattern.
    Les lignes du fichier ayant été chargées puis triées dans un ArrayList, on utilise un foreach pour détecter chaque changement de catégorie et générer un nouveau Panel pour y stocker les boutons de cette catégorie.

    Fais un débug du programme en pas à pas en regardant les variables et tu comprendras tout.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Effectivement les boutons vont devoir envoyer des bits en TCP/IP pour simuler des organes sur un autre appareil
    Oui mais j'ai réussi à comprendre le Regex en faisant un debug etc donc pas de soucis

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Trier des boutons par leurs familles
    Par Invité dans le forum Windows Forms
    Réponses: 2
    Dernier message: 23/01/2020, 11h28
  2. [XL-2002] Accéder à des boutons par leur nom
    Par miron dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 08/07/2009, 15h31
  3. Trier des données par ordre d'importance
    Par popoliline dans le forum Access
    Réponses: 19
    Dernier message: 23/08/2006, 20h42
  4. Trier des fichiers par taille par le VB
    Par tedparker dans le forum Access
    Réponses: 2
    Dernier message: 23/08/2006, 12h59
  5. Remplacer des boutons par des menus déroulants?
    Par drthodt dans le forum Access
    Réponses: 3
    Dernier message: 20/09/2005, 18h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo