Eliminer valeurs deja selectionnées lignes precedentes combobox dans Datagridvie

Signaler
-
Messages postés
2262
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
11 novembre 2020
-
Bonjour ,

je possède un datagridview dont une colonne est de type combobox . Ce combobox est remplit par des valeurs via une requête . je souhaite que , une fois une valeur du combobox est sélectionnée dans un row i , le combobox de la ligne suivante i+1 du datagrid n'obtiendra que les valeurs non sélectionnées avant .. c'est à dire , qu'il faut parcourir toutes les lignes précédentes , extraire les valeurs sélectionnées , et les stocker dans un tableau .. ou quelque shose de ce genre

Merci de m'aider

8 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
70
Salut

Et qu'as-tu écrit, essayé de faire ?

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)

ce que j'ai fait :

la procédure qui permet de charger le combobox :

Public Sub verifier_article()
        cn.Open()
        Dim liste() As String
        ReDim liste(ind)
        For i = 0 To ind
            liste(i) = DataGridView1(1, i).Value
        Next
        Dim cmd As New SqlCommand
        Dim dr As SqlDataReader
        cmd.Connection = cn
        cmd.CommandText = "select designationArticle from Article where designationArticle not IN ('" & String.Join("','", liste) & "')"
        Dim Dgvc As New DataGridViewComboBoxCell
        dr = cmd.ExecuteReader
        If dr.HasRows Then
            While dr.Read
                Dgvc.Items.Add(dr(0))
            End While
            DataGridView1.Item(1, ind) = Dgvc
        End If
        dr.Close()
        cn.Close()
    End Sub


ou ind est une variable initialisée à 0 et s'incremente à chaque ajout d'une nouvelle ligne du datagridview :

 Private Sub DataGridView1_UserAddedRow(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewRowEventArgs)
        ind = ind + 1
        verifier_article()
    End Sub


merci
Private Sub DataGridView1_RowValidated(ByVal sender As Object, ByVal e As ystem.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.RowValidated

ind = ind + 1
verifier_article()
End Sub
Messages postés
2262
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
11 novembre 2020
115 > hejaji
Bonjour
Eh oui cela fait toujours plaisir un bonjour lorsque l'on intervient dans une conversation ( même si elle est virtuelle)
Ensuite depuis 8 ans j'ose espérer que le problème est résolu !

bonsoir ,

merci de répondre

bon j'ai essayé un truc du genre :

 Public Sub charger_article()
        Dim listFirst As List(Of String) = New List(Of String)
        Dim listSecond As List(Of String) = New List(Of String)
        cn.Open()
        Dim cmd As New SqlCommand
        Dim dr As SqlDataReader
        cmd.Connection = cn
        cmd.CommandText = "select designationArticle from Article"
        Dim Dgvc As New DataGridViewComboBoxCell
        dr = cmd.ExecuteReader
        If dr.HasRows Then
            While dr.Read
                listFirst.Add(dr(0))
                ' Dgvc.Items.Add(dr(0))
            End While
        End If
        For i = 0 To DataGridView1.Rows.Count - 2
            listSecond.Add(DataGridView1(1, i).Value)
        Next
        Dim different As IEnumerable(Of String) = listFirst.Except(listSecond)
        Dgvc.Items.Add(different.ToList)
        DataGridView1.Item(1, ind) = Dgvc
        dr.Close()
        cn.Close()
    End Sub


mais à la sélection du combobox ça m'affiche : (Collection)

une idée ??

Merci
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
70
Perso, je ferais :
J'ajouterais toutes les références dans chaque Combo, comme ça, procédure standard
Dès qu'il y a saisie/choix dans une des Combo :
Boucle sur toutes les Combos :
Si ce n'est pas ma propre Combo, je supprime la référence sélectionnée de la Combo.
Pour supprimer une référence dans une Combo, il faudra peut-être encore une boucle sur tous les items et, dès que je l'ai trouvée, je la supprime.
Si la référence est unique dans la liste, je fais aussi un Exit For de la boucle, et je poursuis avec la première boucle des Combos.

bonsoir ,
ta solution est possible , sauf que ça va prendre du temps , vu que je serais obligé de refaire tout le travail . Merci
Sinon , j'arrive bien à éliminer les valeurs trouvées , MAIS pas à la prochaine ligne
n + 1 , ça s'élimine à l'enregistrement n + 2 , donc la valeur peut être sélectionnée 2 FOIS .. je ne sais pas pourquoi .

REPOST Du code :

 cn.Open()
        Dim liste() As String
         ReDim liste(DataGridView1.Rows.Count)
        For i = 0 To DataGridView1.Rows.Count - 3
            liste(i) = (DataGridView1(1, i).Value)
            MsgBox(liste(i))
        Next
        Dim cmd As New SqlCommand
        Dim dr As SqlDataReader
        cmd.Connection = cn
        cmd.CommandText = "select designationArticle from Article where designationArticle not IN ('" & String.Join("','", liste) & "')"
        Dim Dgvc As New DataGridViewComboBoxCell
        dr = cmd.ExecuteReader
        If dr.HasRows Then
            While dr.Read
                'listSecond.Add(dr(0))
                Dgvc.Items.Add(dr(0))
            End While
            DataGridView1.Item(1, ind) = Dgvc
        End If
        dr.Close()
        cn.Close()


la fonction est appelée au chargement du formulaire et à l’événement DataGridView1_UserAddedRow .

Merci

voici comment ça donne .. Comme vous pouvez le constater , on a la possibilité de sélectionner une valeur deux fois , chose qui ne devrait pas être .

Bonjour ,
peut être que je devrais pas faire appel à la fonction à l’événement USERADDEDROW .. ??

HELP

merci