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 :

DataGridView avec 2 ComboBox liées : problème de rafraichissement


Sujet :

VB.NET

  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 50
    Par défaut DataGridView avec 2 ComboBox liées : problème de rafraichissement
    Bonjour à tous,

    Je suis face à un problème sur lequel je bloque depuis plusieurs jours.

    Voici le contexte :
    J'ai une DataGridView avec 2 colonnes, Communes et Sections. Ces 2 colonnes sont des DataGridViewComboBoxColumn :
    - la première est liée à une source de données "liste de communes"
    - l'autre est liée à une source de données "liste de sections"
    La relation entre les communes et les sections est qu'une commune peut contenir plusieurs sections et qu'une section ne se trouve que dans une seule commune.

    Le principe que je dois avoir est que pour chaque ligne distincte du DataGridView, je filtre la liste des sections (2ème colonne) suivant la commune choisie (1ère colonne). Pour ce faire, je filtre la BindingSource des sections suivant l'identifiant de commune dans l'événement CellBeginEdit de ma DataGridView.
    Donc concrètement, lorsque je clique pour éditer une section, je filtre à ce moment-là les sections relatives à la commune choisie.

    Ce principe fonctionne bien mais me montre ses faiblesses lorsque j'ai plusieurs lignes de communes différentes dans mon tableau.

    Supposons que j'ai les données communes (lettres) et sections (chiffres) suivantes :
    A 1
    A 2
    A 3
    B 4
    B 5
    B 6
    C 7
    C 8
    C 9

    Dans ma DataGridView, j'ai les lignes suivantes :
    A 1
    A 2
    B 5
    C 7
    C 8

    Si je clique sur la section de la ligne 2 (2) puis sur la section de la ligne 3 (5), le contenu de la section de la ligne 2 disparait. Pourtant si je retourne sur la section de la ligne 2, son contenu se réaffiche, par contre cette fois c'est le contenu de la section de la ligne 3 qui disparait...

    Ma théorie est que lorsque je passe en revue les sections par ligne de mon tableau, le filtre sur la ligne active est bien affecté, mais du coup les lignes où la commune est différente de la ligne active n'affiche plus correctement la section à cause du filtre, car le BindingSource de la colonne des sections est commun.

    Dans mon exemple, si je me positionne sur la section de la ligne 2, la combobox doit lister les sections 1, 2, 3 pour la commune A. Si je passe sur la ligne 3, la combobox doit lister les sections 4, 5 et 6 pour la commune B. La combobox active est correcte, mais les sections des autres lignes sont vidées parce que la BindingSource est filtrée de manière à exclure les sections 1, 2, 3, 7, 8 et 9.

    J'espère que mon explication est suffisamment claire, ce n'est pas évident à expliquer par écrit ce qui saute aux yeux lorsque le programme tourne.


    Ma question est de savoir comment je peux éviter ce comportement...

    Là je me lance dans une surcharge d'une DataGridViewComboBoxColumn, mais je n'arrive à rien et je commence même à patauger lol

    Merci d'avance aux âmes charitables qui m'aideront à me sortir de là :-)

  2. #2
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 50
    Par défaut
    Rebonjour,

    J'ai pu trouver une solution par moi-même, après plusieurs recherches. Je la laisse ici si jamais ça peut aider quelqu'un.

    Il "suffit" de jongler avec deux BindingSource, l'une complète et l'autre filtrée.

    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
        Private Sub DataGridView_CellBeginEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles Me.CellBeginEdit
            Dim columnName As String = Me.Rows(e.RowIndex).Cells(e.ColumnIndex).OwningColumn.Name
     
            If columnName = Me.SECC_ID.Name Then ' sections
                ' afin d'éviter des problèmes de rafraichissement avec les sections des autres lignes, 
                ' il est nécessaire de jongler avec une liste de sections complète et une autre liste
                ' de sections filtrée sur la cellule active
                Dim cell As DataGridViewComboBoxCell = Me.Rows(e.RowIndex).Cells(e.ColumnIndex)
                cell.DataSource = Me.SECTIONSCADASTRALESFILTERBindingSource
                Me.SECTIONSCADASTRALESFILTERBindingSource.Filter = "CCAD_ID = " & Me.Rows(e.RowIndex).Cells(Me.CCAD_ID.Name).Value
            End If
        End Sub
     
     
        Private Sub DataGridViewParcelles_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles Me.CellEndEdit
            Dim columnName As String = Me.Rows(e.RowIndex).Cells(e.ColumnIndex).OwningColumn.Name
     
            If columnName = Me.SECC_ID.Name Then
                ' afin d'éviter des problèmes de rafraichissement avec les sections des autres lignes, 
                ' il est nécessaire de jongler avec une liste de sections complète et une autre liste
                ' de sections filtrée sur la cellule active
                Dim cell As DataGridViewComboBoxCell = Me.Rows(e.RowIndex).Cells(e.ColumnIndex)
                cell.DataSource = Me.SECTIONSCADASTRALESBindingSource
                Me.SECTIONSCADASTRALESFILTERBindingSource.Filter = ""
            End If
        End Sub
    Dans l'événement CellBeginEdit, j'affecte le DataSource de la cellule active avec le BindingSource filtré.
    Dans l'événement CellEndEdit, je réinitialise le DataSource de la cellule active avec le BindingSource complet.

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

Discussions similaires

  1. datagridview avec un combobox comme foreign key
    Par mohcine- dans le forum VB.NET
    Réponses: 6
    Dernier message: 06/03/2011, 16h25
  2. Datagridview avec des combobox dynamique
    Par gnomathibus dans le forum Windows Forms
    Réponses: 8
    Dernier message: 21/07/2010, 09h19
  3. [c#][.NET 2.0] Datagrid avec 2 combobox liées entre elles
    Par axl63800 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 20/04/2007, 09h31
  4. [.net] Problème avec un combobox.
    Par adicor dans le forum MFC
    Réponses: 13
    Dernier message: 07/06/2006, 14h56
  5. [VB6]Problème de rafraichissement d'une combobox
    Par bb62 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 27/01/2006, 16h58

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