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

VB.NET Discussion :

Ajouter une chaîne nulle en tête de liste d'un combobox [Débutant]


Sujet :

VB.NET

  1. #1
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut Ajouter une chaîne nulle en tête de liste d'un combobox
    Bonjour,

    Je suis en train de coder un formulaire "critère de recherche" pour afficher le résultat d'une requête dont l'utilisateur rentrerait ses propres critères.

    Parmi les champs servant de critère j'ai une combobox dont la liste est liée à une table via une liaison.
    Mais comme il s'agit d'un champ de recherche, il faut que je rajouter un champ vide (ou "(tous)" par exemple) en tête de liste (index 0) pour permettre à l'utilisateur de supprimer ce champ de son critère de recherche.

    Je sais attribuer l'index -1 à cet combo au chargement du formulaire pour que ce champ soit vierge au démarrage mais dès que l'utilisateur choisit une valeur, il ne peut plus revenir en arrière.

    J'ai bien essayé d'appliquer la méthode Dataset.rows.add suivi d'un "sorted = true" mais cela ne change pas les index si bien que en sélectionnant la première valeur, le code comprend que j'ai sélectionné la 2ème valeur...

    Précision importante, le champ utilisé dans ma requête ayant servi à remplir le combo n'admet pas la valeur nulle. Je ne peux donc pas "artificiellement" rajouter une ligne vierge dans ma table d'origine

    Merci pour votre aide.

  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 : 43
    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 753
    Points
    39 753
    Par défaut
    Citation Envoyé par noftal Voir le message
    Précision importante, le champ utilisé dans ma requête ayant servi à remplir le combo n'admet pas la valeur nulle. Je ne peux donc pas "artificiellement" rajouter une ligne vierge dans ma table d'origine
    Dans la table en DB tu ne peux pas, mais tu peux l'ajouter à la DataTable. En supposant que tu aies 2 champs Id et Name, tu peux faire quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim empty = table.NewRow()
    empty("Id") = -1
    empty("Name") = String.Empty
    table.Rows.InsertAt(empty, 0)
    empty.AcceptChanges()
    Note l'utilisation de AcceptChanges : ça permet que la ligne ne soit pas considérée comme nouvelle, comme ça elle ne sera pas ajoutée à la DB si tu fais un Update sur la table.

  3. #3
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut
    Merci !
    Je regarde ça et je te tiens au courant.

  4. #4
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut
    Bon alors en adaptant ta réponse à mon cas, j'obtiens ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      Dim empty = Me.mondataset.ListeRégions.NewRow()
            empty("Région") = String.Empty
            Me.mondataset.ListeRégions.Rows.InsertAt(empty, 0)
            empty.AcceptChanges()
            With CB_Région
                .DataSource = Me.mondataset.ListeRégions
                .ValueMember = "Région"
                .DisplayMember = "Région"
            End With
    Je peux donc continuer à lier par le code (mais pas par le designer) ma combobox à ma table.
    Ca marche très bien effet. Je n'ai juste pas compris pourquoi on me refuse la syntaxe suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If CB_Région.SelectedValue <>"" Then...
    J'ai dû contourner en écrivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If CB_Région.SelectedIndex <> 0 Then...
    Sinon, j'ai aussi trouvé une autre possibilité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CB_Région
            CB_Région.Items.Add("")
            For Each item As DataRow In Me.mondataset.ListeRégions
            CB_Région.Items.Add(item(0))
            Next
    Dans ce cas, il faut que je supprime toute utilisation du Datasource dans le code et dans le designer puisque je passe par les items, même si, sur le fond, cela revient au même (il y a bien un lien entre mon code et ma CB)
    Toujours dans ce cas, il faut que je remplace toutes mes SelectedIndex par des SelectedItems.
    Enfin, ce code semble plus court et marche aussi.

    D'où ma question subsidiaire : Laquelle des 2 solutions est la meilleure sur le plan de la programmatique ?

  5. #5
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut
    Juste une correction de mon message précédent. Dans la 1ère solution les 5 dernières lignes de code peuvent aussi être remplacées par le designer.

    Donc en longueur de code apparent c'est kif.
    Ma question sur la comparaison entre les 2 solutions demeure en terme de philosophie de code.

  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 : 43
    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 753
    Points
    39 753
    Par défaut
    Citation Envoyé par noftal Voir le message
    Je n'ai juste pas compris pourquoi on me refuse la syntaxe suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If CB_Région.SelectedValue <>"" Then...
    Moi non plus... cette syntaxe est pourtant valide. Qu'entends-tu par "refuse" ? Erreur de compilation ? Erreur à l'exécution ? Que dit le message d'erreur ?

  7. #7
    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 : 43
    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 753
    Points
    39 753
    Par défaut
    Citation Envoyé par noftal Voir le message
    D'où ma question subsidiaire : Laquelle des 2 solutions est la meilleure sur le plan de la programmatique ?
    Perso je préfère utiliser le binding, c'est plus propre. D'ailleurs c'est la seule façon de faire si la valeur n'est pas le texte affiché (comme dans mon exemple avec Id et Name)

  8. #8
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut
    Ben, je n'arrive plus à reproduire l'erreur. Tout marche à présent avec cette syntaxe. Ce devait être autre chose.

  9. #9
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Perso je préfère utiliser le binding, c'est plus propre. D'ailleurs c'est la seule façon de faire si la valeur n'est pas le texte affiché (comme dans mon exemple avec Id et Name)
    Bon alors je vais retenir ta solution. Merci !

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

Discussions similaires

  1. ajouter [une chaîne de caractères ] tableau char
    Par silver4 dans le forum Débuter
    Réponses: 8
    Dernier message: 08/03/2013, 10h21
  2. Comment ajouter une chaîne dans une liste avec les API Windows ?
    Par DelphiCool dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 02/02/2013, 13h47
  3. [SP-2010] Ajouter une pièce jointe à un élément de liste dans SharePoint 2010
    Par dhiaeddine2012 dans le forum SharePoint
    Réponses: 0
    Dernier message: 05/12/2012, 14h56
  4. Comment Ajouter une valeur nulle a une table d'un dataset?
    Par baradoss dans le forum Windows Forms
    Réponses: 11
    Dernier message: 17/05/2009, 20h47
  5. Réponses: 4
    Dernier message: 24/07/2006, 17h34

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