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 :

DatagridViewComboBox liée à une DataTable


Sujet :

VB.NET

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 299
    Par défaut DatagridViewComboBox liée à une DataTable
    Et oui, je sais, encore un sujet avec cet objet complexe qu'est le combobox intégré au DataGridView...

    J'ai vérifié au préalable si le problème a déjà été rapporté, mais je n'ai rien vu de proche à ma problématique... :

    1) Mon DataGridView (lié à un DataSource) contient une colonne créée manuellement, de type ComboBox. Cette comboBox est remplie dynamiquement selon des options préalables. La première ligne contient un texte de type '"veuillez choisir...", les lignes suivantes sont alimentées en fonction de ces options. Il y a donc toujours au moins une ligne dans la combo même si aucune option n'est activée.

    2) Le remplissage de cette combo se fait via une datatable créée dynamiquement avec deux datacolumn, une qui sert pour le DisplayMember et une pour le ValueMember
    Le ValueMember de ma première ligne vaut 0

    Je souhaiterais que lorsqu'une option est mise à jour (et donc que mon DataTable est regénéré), l'ensemble des lignes de mon DataGridView soit réinitialisé avec cette première ligne. Actuellement, je n'arrive pas à 'forcer' la moindre valeur (la propriété Value de mon DataGridView entraine une erreur je suppose du fait qu'un DataSource est associé à cette colonne).

    Et là, ca coince ! Des idées ???

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 299
    Par défaut
    Hmmm...
    7 lectures en 24 h, ca ne passionne pas les foules, la datagridviewcombobox !

    Je reformule ma question de façon plus claire peut être :

    Comment sélectionner par programmation l'item d'une cellule de type combobox lorsque le datagridviewcombobox est lié à une datatable ?

  3. #3
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Par défaut
    As-tu essayé de modifier la source de données directement plutot que le DataGridView ?

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 299
    Par défaut
    Oui Skalp, j'ai bien pensé à cette solution puisque cette colonne est liée via la propriété DataSource mais je ne vois pas de méthodes permettant de 'sélectionner' une ligne de la datatable de sorte que ma combo prenne la valeur associée.

    En fait mon datatable contient les 2 colonnes suivantes, la première étant en DisplayMember et la seconde en ValueMember de ma DataGridViewComboBoxColumn :
    "Veuillez choisir un item",0
    "Item1",1
    "Item2",2
    ...

    Je voudrais que quand mon datagridview soit affiché, le premier item soit sélectionné dans mon combobox (par défaut, la cellule de type combobox est vide et attend patiemment que l'utilisateur déroule la combo et choisisse un item).
    Je voudrais aussi réinitialiser chaque ligne avec le premier item en cas de changement d'options (les options définissant les items) mais la méthode est similaire au cas précédent.

    C'est cette sélection d'item qui pose problème en fait...

  5. #5
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Par défaut
    Citation Envoyé par nikoko34 Voir le message
    Oui Skalp, j'ai bien pensé à cette solution puisque cette colonne est liée via la propriété DataSource mais je ne vois pas de méthodes permettant de 'sélectionner' une ligne de la datatable de sorte que ma combo prenne la valeur associée.
    Tu n'as pas besoin d'agir sur le DataTable qui alimente le combobox, il te suffit de modifier ton DataSource en mettant la valeur 0 (qui correspond, si j'ai bien suivi à l'option "Veuillez choisir...") pour tous les enregistrements du champ correspondant à la colonne. Le combobox doit se positionner automatiquement sur la valeur correspondante.

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 299
    Par défaut
    Merci Skalp de t'intéresser à mon problème.

    Le fait de mettre à 0 la cellule (donc avec .Value = 0) génère une erreur (dataerror).
    Dans ce cas, la cellule affiche le 0 et l'erreur est déclenchée lorsque le pointeur passe sur la cellule.
    J'ai aussi essayé d'affecter le .Value avec le texte associé à la valeur 0 et celà ne change rien au résultat.

    Quand tu dis "Modifier le datasource en mettant la valeur 0" (alors que le datasource de cette colonne est justement un datatable), tu le traduis comment en terme de propriété settée ?

  7. #7
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Par défaut
    Citation Envoyé par nikoko34 Voir le message
    Merci Skalp de t'intéresser à mon problème.

    Le fait de mettre à 0 la cellule (donc avec .Value = 0) génère une erreur (dataerror).
    Dans ce cas, la cellule affiche le 0 et l'erreur est déclenchée lorsque le pointeur passe sur la cellule.
    J'ai aussi essayé d'affecter le .Value avec le texte associé à la valeur 0 et celà ne change rien au résultat.

    Quand tu dis "Modifier le datasource en mettant la valeur 0" (alors que le datasource de cette colonne est justement un datatable), tu le traduis comment en terme de propriété settée ?
    Tu te focalises trop sur ce DataTable lié à ta colonne

    Je parle du DataSource de ton DataGridView. Modifie DIRECTEMENT l'objet que tu as mis dans le DataSource et non la valeur de la cellule du DataGridView.
    Ca doit donner quelque chose comme ça (c'est en C#, mais tu devrais comprendre le principe) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    List<MonType> maCollection = new List<MonType>();
    monDataGridView.DataSource = maCollection;
     
    foreach (MonType var in maCollection)
    {
        var.Id = 0;
    }
    monDataGridView.Refresh();

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 299
    Par défaut
    En fait Skalp, je n'ai sans doute pas été assez clair dans mon message initial :
    Certes, mon DataGridView est lié à un DataSource (qui fonctionne correctement) mais la colonne de type Combobox ne l'est pas !

    Elle est ajoutée en conception et les items de ma combo arrivent à être correctement alimentés via un AUTRE datasource créé dynamiquement sur ce DataTable.

    Finalement, le problème serait inchangé si le datagridview ne contenait que cette colonne (et donc que le datasource associé au datagridview n'était pas défini).

    Je sais, je suis embêtant...

  9. #9
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Par défaut
    Citation Envoyé par nikoko34 Voir le message
    En fait Skalp, je n'ai sans doute pas été assez clair dans mon message initial :
    Certes, mon DataGridView est lié à un DataSource (qui fonctionne correctement) mais la colonne de type Combobox ne l'est pas !
    Sisi, c'est clair, c'est juste que j'avais déjà oublié ce détail...

    La solution la plus efficace serait d'intégrer la gestion de cette colonne dans le DataSource (pour retomber dans la situation à laquelle je pensais ). Sinon, je pense que tu vas t'embêter à gérer des colonnes liées et une colonne non liée.

    Qu'en penses-tu ?

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 299
    Par défaut
    Pas de problème pour essayer ta proposition dans l'après midi.

    Le problème évolue finalement vers la façon de définir un datasource pour remplir une colonne de type DataGridViewColumnComboBox

    J'avais pensé au DataTable car le fait de gérer deux colonnes autorise par la suite de définir les propriétés DisplayMember (le texte visible) et ValueMember (un Id utilisé par la suite).

    Tu proposes de remplacer le DataTable par le type List, why not si j'arrive à respecter la contrainte ci-dessus dès lors qu'il devient possible de forcer l'item de la liste contrairement au datatable !

  11. #11
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 299
    Par défaut
    Bingo grâce à l'intervention efficace de Skalp que je remercie chaleureusement.

    Il "suffisait" de définir la propriété colTransformation.DefaultCellStyle.NullValue avec la valeur du premier item (le display, pas le value).

    Un lien MSDN pour avoir du code plus complet: http://msdn.microsoft.com/en-us/library/ms404353.aspx

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

Discussions similaires

  1. Colonne liée à une autre DataTable
    Par Epiphany dans le forum ADO.NET
    Réponses: 5
    Dernier message: 15/02/2012, 09h42
  2. Réponses: 3
    Dernier message: 19/07/2006, 14h28
  3. [Rave] Impression d'une Band liée à une DataBand
    Par kilinette dans le forum Rave
    Réponses: 3
    Dernier message: 11/07/2005, 16h40
  4. [C#] Modifier une valeur dans une DataTable
    Par Scorff dans le forum ASP.NET
    Réponses: 2
    Dernier message: 23/05/2005, 10h45
  5. Griser 1 liste déroulante liée à une autre, pb de concaténat
    Par linou dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/03/2005, 16h45

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