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

Windows Forms Discussion :

manipulation d'objet Items entre deux listbox


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur

    Avatar de Torgar
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2007
    Messages
    2 334
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2007
    Messages : 2 334
    Par défaut manipulation d'objet Items entre deux listbox
    Bonjour à tous,

    Description :
    je développe une application cliente d'un serveur de base de données de type SQL Server dans le cadre de mon bts pour démontrer à la fois la compétence BDD et celle de programmation événementielle.

    Je gère un système de réservation de salle de cours suivant une plage horaire ainsi que la date et l'enseignant qui fait la demande de réservation.

    J'ai donc un formulaire pour ajouter un enseignant et lui rattacher les classes dans lesquelles il enseigne. Pour ce faire je dispose de deux champs Nom et Prénom et deux listbox dont une contient la liste de toutes les classes déjà enregistrées et l'autre listbox est vide.
    Un bouton permet d'ajouter la classe d'une liste à l'autre.

    Sachant que la première liste qui contient les classses est issue d'une DataSource (ValueMember et DisplayMember prenant respectivement pour valeur le numéro de la classe et son libellé). Donc le problème se situe dans le fait que lorsque je clique sur le bouton d'ajout dans la deuxième liste vierge, je transfert bien l'objet contenant la valuemember et le displaymember, mais le nom qui apparaît dans la deuxième liste est le nom de l'objet et non le displaymember.

    Toutefois, j'ai écris une transaction pilotée par le client qui se permet de créer l'enseignant (une requête) et d'ajouter les classes dans la base de données (tant qu'il y a des objets dans la deuxième liste il ajoute dans la table le numéro de la classe et celui de l'enseignant nouvellement créé). Cette transaction marche très bien donc l'objet passe bien dans ma deuxième liste, c'est juste que le displaymember prends le nom de l'objet comme text.

    Le problème devrais ce trouvé dans la méthode btnAdd_Click().

    Voici le code complet de ma classe pour vous éclairer un peu plus.

    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
    using System;
    using System.Collections.Generic;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Data.SqlClient;
    using System.Data.SqlTypes;
     
    namespace Client_PTI_ECOLE
    {
        public partial class ajoutProf : Form
        {
            public static SqlCommand cmd, requete, cmdCreeProf, cmdAssocieClasse, cmdSelectLastProf, cmdSelectNumClasse;
            public static SqlDataReader numProf, numClasse;
            public static SqlConnection Connexion;
            private int numprof, numclasse;
     
            public ajoutProf()
            {
                InitializeComponent();
                listBox1.DataSource = BD.lireClasse();
                listBox1.ValueMember = "Numero";
                listBox1.DisplayMember = "Libelle";
                Connexion = BD.connexion();
            }
     
            private void btnCancel_Click(object sender, EventArgs e)
            {
                this.Close();
            }
     
            private void btnValider_Click(object sender, EventArgs e)
            {
                if (nomProf.Text != "" || prenomProf.Text != "")
                {
                    // ============================================================
    				// Définition des objets Command pour les procédures stockées :
    				// ============================================================
     
    				// ============================
    				// Pour la création du Prof :
    				// ============================
    				// Objet SqlCommand
    				cmdCreeProf = new SqlCommand("sp_insert_prof", Connexion);
    				// On indique que l'on souhaite utiliser une procédure stockée
    				cmdCreeProf.CommandType = CommandType.StoredProcedure;
    				// On indique les paramètres
    				cmdCreeProf.Parameters.Add("@nom", SqlDbType.VarChar).Value = nomProf.Text;
    				cmdCreeProf.Parameters.Add("@prenom", SqlDbType.VarChar).Value = prenomProf.Text;
    				// On donne le nom de cette procédure stockée
    				cmdCreeProf.CommandText = "sp_insert_prof";
     
    				// ====================================
    				// Pour l'ajout des classes associées au prof :
    				// ====================================
    				cmdAssocieClasse = new SqlCommand("sp_insert_prof_classe", Connexion);
    				// On indique que l'on souhaite utiliser une procédure stockée
    				cmdAssocieClasse.CommandType = CommandType.StoredProcedure;
    				// On donne le nom de cette procédure stockée
    				cmdAssocieClasse.CommandText = "sp_insert_prof_classe";
     
    				// =============
    				// Transaction :
    				// =============
     
    				// --------------------------------------------------------------
    				// 1) Début de la transaction :
    				// --------------------------------------------------------------
                    SqlTransaction MaTransaction = Connexion.BeginTransaction();
     
    				try
    				{
    					// --------------------------------------------------------------
    					// 2) L'objet transaction est assigné à la propriété Transaction
    					//    de chaque objet Command à exécuter :
    					// --------------------------------------------------------------
     
    					cmdCreeProf.Transaction			= MaTransaction;
    					cmdAssocieClasse.Transaction	= MaTransaction;
     
    					// --------------------------------------------------------------
    					// 3) Exécution des commandes de la transaction :
    					// --------------------------------------------------------------
     
    					// Création du Prof :
    					cmdCreeProf.ExecuteNonQuery();
     
    					// Objet SqlCommand
    					cmdSelectLastProf = new SqlCommand("sp_select_last_prof", Connexion);
                        // On associe l'objet à la transaction
                        cmdSelectLastProf.Transaction = MaTransaction;
    					// On indique que l'on souhaite utiliser une procédure stockée
    					cmdSelectLastProf.CommandType = CommandType.StoredProcedure;
    					// On donne le nom de cette procédure stockée
    					cmdSelectLastProf.CommandText = "sp_select_last_prof";
    					// On exécute la procédure stockée
    					numProf = cmdSelectLastProf.ExecuteReader();
    					// On lit le premier et unique résultat
    					numProf.Read();
                        numprof = numProf.GetInt16(0);
                        numProf.Close();
     
    					// Association des classes à l'enseignant
    					for ( int i=0; i < listBox2.Items.Count; i++ )
    					{
    						// On indique le paramètre pour l'enseignant
    						cmdAssocieClasse.Parameters.Add("@num_ens", SqlDbType.VarChar).Value = numprof;
    						// On indique le paramètre pour la classe
                            cmdAssocieClasse.Parameters.Add("@num_cla", SqlDbType.VarChar).Value = ((ClasseNUM_INT)(listBox2.Items[i])).Numero;
    						// On exécute la procédure stockée
    						cmdAssocieClasse.ExecuteNonQuery();
                            cmdAssocieClasse.Parameters.Clear();
    					}
     
    					MaTransaction.Commit();
    					MessageBox.Show("Le nouvel enseignant a été créé.",	"Transaction achevée", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        Connexion.Close();
                        btnCancel.Text = "Quitter";
                        btnValider.Enabled = false;
    				}
     
    				catch (Exception UneException)
    				{
    					// -------------------------------
    					// Annulation de la transaction :
    					// -------------------------------
     
    					MaTransaction.Rollback();
     
    					MessageBox.Show("L'erreur suivante s'est produite : " + UneException.Message
    						+ "\nAucune donnée n'a été écrite dans la base.",
    						"Erreur", MessageBoxButtons.OK, MessageBoxIcon.Stop);
    					Connexion.Close();
    				}
    			}
                else
                {
                    MessageBox.Show("Veuillez remplir tous les champs, merci");
                }
            }
     
            private void btnAdd_Click(object sender, EventArgs e)
            {
                if (listBox2.Items.IndexOf(listBox1.Text) > -1)
                {
                    MessageBox.Show("La classe est déjà affectée à l'enseignant");
                }
                else
                {
                    listBox2.Items.Add(listBox1.SelectedItem);
     
                }
            }
     
            private void btnSup_Click(object sender, EventArgs e)
            {
                listBox2.Items.RemoveAt(listBox2.Items.IndexOf(listBox2.Text));
            }
        }
    }
    Cordialement,

    Torgar
    Je ne suis pas schizophrène, nous sommes unanime !!!

    ► Pensez à la balise code et au CODE HTML GENERE !!!!
    ► Au si c'est le cas et au à ceux qui vous ont aidé.
    Vous souhaitez participer aux rubriques CSS et (X)HTML ? Contactez-nous !

    Créer des colonnes de même hauteur en CSS
    Glossaire CSS
    Les bordures en CSS3
    Les transitions en CSS3

  2. #2
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    C'est parce que tu n'utilises de datasource pour le deuxième listbox, donc quand tu fais Items.Add(...), il ajoute le retour de ToString() de l'objet passé en paramètre.

    Note : Ton code va à l'encontre de tous les principes de développement tant au niveau des conventions de nommage, qu'au niveau des principes de maintenabilité (séparation de la logique d'interface et de la logique métier en particulier). Si tu ne fais pas d'effort pour coder un minimum proprement, ton application va devenir un cauchemar à développer et surtout à maintenir.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  3. #3
    Rédacteur

    Avatar de Torgar
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2007
    Messages
    2 334
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2007
    Messages : 2 334
    Par défaut
    Merci d'avoir répondu. Désolé de ne pas être passé plus tôt, mais je suis en BTS blanc cette semaine et donc pas trop de temps.

    Je regarderai comment faire pour la deuxième listbox.

    Je ne sais pas trop quoi te dire pour cette façon de coder étant donné qu'on m'a appris ce langage de cette manière et j'avoue que je ne suis pas fan du C#. Pour ma petite défense, mes profs ne m'ont rien dit de particulier...

    Je suis à l'écoute de tous conseils et/ou article concernant ta note.


    Cordialement,

    Torgar
    Je ne suis pas schizophrène, nous sommes unanime !!!

    ► Pensez à la balise code et au CODE HTML GENERE !!!!
    ► Au si c'est le cas et au à ceux qui vous ont aidé.
    Vous souhaitez participer aux rubriques CSS et (X)HTML ? Contactez-nous !

    Créer des colonnes de même hauteur en CSS
    Glossaire CSS
    Les bordures en CSS3
    Les transitions en CSS3

  4. #4
    Expert confirmé

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Par défaut
    Citation Envoyé par Torgar Voir le message
    Pour ma petite défense, mes profs ne m'ont rien dit de particulier...
    Ca ne m'etonne pas vraiment, j'ai rarement vu des profs apprendre a coder comme il faut...en fait...jamais

    A mon humble avis :
    d'abord, il faut te mettre a decouper ton code en couches :
    http://morpheus.developpez.com/architecture/
    puis une fois que tu as des couches propres (pampeeeers), tu mets en place une belle couche d'acces aux donnees :
    http://johannblais.developpez.com/tu...acces-donnees/


    Et apres, si tu veux vraiment aller plus loin, patterns et poo

    genre, dans la collection head first, tu as head first design patterns et head first poo (de tete..)

    je ne suis pas fan du C#
    c'est pas specifique au C#...si tu fais le meme code en java, tu auras (enfin, j'espere...) les memes remarques

    Mon Blog

    The Cake is still a lie !!!



    Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
    Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.

  5. #5
    Rédacteur

    Avatar de Torgar
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2007
    Messages
    2 334
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2007
    Messages : 2 334
    Par défaut
    Citation Envoyé par pvialatte Voir le message
    c'est pas specifique au C#...si tu fais le meme code en java, tu auras (enfin, j'espere...) les memes remarques
    Si je comprends bien, ça risque de pas être triste ce BTS au niveau PTI...

    Bon et bien je vous remercie infiniment pour vos informations qui vont surement me sauver ^^

    Je vais potasser ça en vitesse pour modifier mes PTI.

    Cordialement,

    Torgar
    Je ne suis pas schizophrène, nous sommes unanime !!!

    ► Pensez à la balise code et au CODE HTML GENERE !!!!
    ► Au si c'est le cas et au à ceux qui vous ont aidé.
    Vous souhaitez participer aux rubriques CSS et (X)HTML ? Contactez-nous !

    Créer des colonnes de même hauteur en CSS
    Glossaire CSS
    Les bordures en CSS3
    Les transitions en CSS3

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

Discussions similaires

  1. [Débutant] Drag Drop entre deux ListBox qui contiennent des objets
    Par shaun_the_sheep dans le forum Windows Forms
    Réponses: 2
    Dernier message: 12/10/2012, 17h15
  2. Manipulation de données entre deux listbox
    Par McShark dans le forum VB.NET
    Réponses: 9
    Dernier message: 07/05/2010, 17h50
  3. Ajout et Suppression entre deux listBox
    Par sacofan dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 07/01/2007, 17h02
  4. focus entre deux listbox
    Par krokmitaine dans le forum Delphi
    Réponses: 6
    Dernier message: 13/12/2006, 07h18
  5. Faire passer des items entre deux zones de listes
    Par ludobado dans le forum Access
    Réponses: 8
    Dernier message: 04/05/2006, 18h33

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