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 :

Ajouter un élément vide automatiquement sur un combobox


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 202
    Points : 43
    Points
    43
    Par défaut Ajouter un élément vide automatiquement sur un combobox
    Bonjour,

    Je viens de créer un formulaire winforms, a grand renfort de linq et de databindingsource.
    C'est formidable, ça marche avec 2 lignes de code (enfin presque)

    J'ai juste un soucis avec un combobox. Ce dernier est associé à un champ qui est une clef externe dans ma base de données. Vous l'aurez compris, ce combobox affiche la liste des données présentes dans la table connexe.

    ça marche bien, sauf que je voudrais rajouter un element vide dans ce combobox (cas ou je veux mettre NULL en guise de clef externe, ce qui est permis dans la base que j'ai créé).

    Et la c'est la cata, j'ai réussi à le faire, mais avec du code pourri qui rajoute un element vide avec une union (j'utilise linq pour alimenter le datasource du combobox)

    Alors voila si quelqu'un a une idée pour faire ce que je demande proprement, je suis preneur !

    A+

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Pas 36 solutions... il faut ajouter un élément "bidon" à la source de données
    Quand tu parles de Linq, tu veux dire Linq to SQL ou Linq to Entities (Entity Framework) ?

    Avec EF tu pourrais faire un truc comme ça : (en supposant que la table s'appelle "Trucs")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Truc t = new Truc();
    db.AddToTrucs(t);
    db.AcceptAllChanges(); // pour éviter que l'objet bidon ne soit ajouté à la BDD lors du SaveChanges

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 202
    Points : 43
    Points
    43
    Par défaut
    Merci pour ta réponse.

    J'ai essayé ce que tu me dit, mais j'ai un problème: Si l'utilisateur choisit cette valeur bidon et qu'il valide j'ai une erreur de contrainte FK lorsque je fait un submitchanges...
    En fait, il faudrait trouver un moyen automatique pour que ça insere NULL dans la FK. Tu vois le truc ?

    Pour info, j'utilise linq to sql et je ne connais pas Entity Framework, je ne sais pas ce que c'est. ça sert a quoi en deux mots ?

    A+

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par boby62423 Voir le message
    Pour info, j'utilise linq to sql
    Le code que j'ai donné est valable pour Entity Framework, pas pour Linq to SQL... celà dit on peut probablement faire quelque chose de similaire avec Linq to SQL.

    Citation Envoyé par boby62423 Voir le message
    je ne connais pas Entity Framework, je ne sais pas ce que c'est. ça sert a quoi en deux mots ?
    Ben c'est un ORM un peu comme Linq to SQL, mais c'est plus souple :
    - ce n'est pas limité à SQL Server, ça peut aussi être utilisé avec d'autres types de BDD
    - tu as plus de contrôle sur le modèle objet généré, qui n'est pas obligé de correspondre exactement à la structure de la base de données


    Pour ton problème :
    En fait il faudrait affecter une valeur "bidon" (par exemple -1) à l'identifiant de l'élément que tu ajoutes. Ensuite, il suffit de vérifier la SelectedValue du ComboBox : si c'est -1, tu considères qu'aucun élément n'est sélectionné

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 202
    Points : 43
    Points
    43
    Par défaut
    Pour le coup du -1, c'est justement ce que j'ai fait: Ensuite avant le submitchanges, je teste la valeur de la combobox et je met null dans le champ FK de l'objet mais je trouve cela crado quand meme ...

    Je pensais qu'on pouvait mettre n'importe quelle connectionstring vers n'importe quel type de bdd avec linq to sql. T'es sur que c'est limité à sql server ?

    Merci pour les réponses

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par boby62423 Voir le message
    T'es sur que c'est limité à sql server ?
    Ca marche aussi avec SQL Server Compact il me semble, mais c'est tout... En plus, l'architecture n'est pas ouverte (contrairement à EF), donc il n'y a pas de moyen simple de créer d'autres providers.
    De toutes façons MS est en train de laisser tomber Linq to SQL au profit d'EF, à ce qu'il parait...

  7. #7
    Membre régulier Avatar de Roach-
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2004
    Messages : 135
    Points : 108
    Points
    108
    Par défaut
    Perso j'utilise les DataSet auquel j'ajoute une ligne avant l'affichage.

    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
     
            public static void fillComboBox(ComboBox comboName, string query, string dsTable, string display, string value)
            {
                comboName.Items.Add(string.Empty);
                MySqlConnection SqlCnx = new MySqlConnection();
                MySqlDataAdapter myAdapter = new MySqlDataAdapter();
                DataSet ds = new DataSet();
                SqlCnx.ConnectionString = "DataBase=prestige_app;DataSource=host;User Id=blah;Password=blah";
                try
                {
                    SqlCnx.Open();
                    myAdapter.SelectCommand = new MySqlCommand(query, SqlCnx);
                    myAdapter.Fill(ds, dsTable);
                    DataRow daRow = ds.Tables[dsTable].NewRow();
                    daRow["Valeur"] = "-";
                    daRow["ID"] = 0;
                    ds.Tables[dsTable].Rows.InsertAt(daRow, 0);
                    comboName.DataSource = ds.Tables[dsTable];
                    comboName.DisplayMember = display;
                    comboName.ValueMember = value;
                }
                catch (MySqlException Ex)
                {
                    MessageBox.Show("DataBase Error (fillComboBox): " + Ex.Message, "DataBase Error", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                }
                finally
                {
                    myAdapter.Dispose();
                    ds.Dispose();
                    SqlCnx.Close();
                    SqlCnx.Dispose();
                }
            }
    Roach aka Jean-François Dufour

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 202
    Points : 43
    Points
    43
    Par défaut
    Ok pour le dataset mais au moment ou tu valides le formulaire, comment tu fais pour que ça écrive NULL dans la base de données ?

  9. #9
    Membre régulier Avatar de Roach-
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2004
    Messages : 135
    Points : 108
    Points
    108
    Par défaut
    Tu travail avec l'index.

    Si il est = 0
    tu ajoute null a la db
    sinon tu ajouter la valeur choisi.
    Roach aka Jean-François Dufour

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 202
    Points : 43
    Points
    43
    Par défaut
    Comment ça si il est à 0 je met null dans la bdd ?
    Je travaille avec des bindingSource donc tout est transparent, je n'ai pas de controle a ce niveau (enfin si je prend controle, ça sera crado...)

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    dans le code précédent, remplace :
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    daRow["ID"] = DBNull.Value;
    Ca devrait le faire...

    EDIT: peut-être pas en fait... si Id est la clé primaire, il ne peut pas valoir null

    D'ailleurs je me suis toujours demandé pourquoi la possibilité d'ajouter un élément vide à un ComboBox bindé n'était pas intégrée... ni en Windows Forms, ni en ASP.NET, ni en WPF

  12. #12
    Membre régulier Avatar de Roach-
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2004
    Messages : 135
    Points : 108
    Points
    108
    Par défaut
    Effectivement ça devrait être intégré.
    Roach aka Jean-François Dufour

Discussions similaires

  1. [Toutes versions] Comment ajouter un élément dans une ComboBox déjà alimentée automatiquement
    Par BornToBe dans le forum VBA Access
    Réponses: 6
    Dernier message: 17/04/2012, 17h08
  2. Disable automatique sur combobox vide (MVVM)
    Par SIC83 dans le forum Silverlight
    Réponses: 8
    Dernier message: 17/02/2012, 17h27
  3. Réponses: 15
    Dernier message: 08/10/2008, 01h04
  4. une ligne vide s'ajout automatiquement sur un datagrid
    Par tsdia2 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 27/06/2008, 19h54
  5. [Jlist][DefaultListModel] Listener sur ajout d'éléments
    Par Invité dans le forum Composants
    Réponses: 2
    Dernier message: 23/03/2006, 15h32

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