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 :

Filtrage/triage d'une combobox par une autre [Débutant]


Sujet :

VB.NET

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 81
    Par défaut Filtrage/triage d'une combobox par une autre
    Bonjour,

    Cela fait plusieurs jours que j'essaie sans succès de filtrer un combobox par un autre.

    Le premier combobox a une collection d'items à 3 chiffres, et ces 3 chiffres permettraient de trier le second.

    Le combobox que je souhaite filtrer à des items, tous importer d'un fichier .txt et sont des références de roulements pour ceux qui connaissent. Les 3 premiers chiffres désignent le type du roulement, et sont ceux définis dans le premier Combobox.

    Ce que je voudrais : dès que la personne sélectionne un des différents types dans le permier Combobox, seul ceux démarrant par ces 3 premiers chiffres apparaissent dans le second.

    Le fichier .txt est d'abord importé dans un DataTable, pour ensuite figurer dans le DataSource du combobox

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub FenètreDeCalcul_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim DataTableSKF As New DataTable
     
            DataTableSKF = OuvrirCatalogueSKF()
            ComboBoxRéférenceSKF.DataSource = DataTableSKF
            ComboBoxRéférenceSKF.DisplayMember = DataTableSKF.Columns(0).ColumnName
            ComboBoxRéférenceSKF.ValueMember = DataTableSKF.Columns(0).ColumnName
     
        End Sub
    quelques questions :

    Est-ce qu'il vaut mieux travailler sur le ComboBox ou sur le DataTable pour éxecuter le filtre ?

    Le DataTable est il suffisant pour ce type de fonctionnement ? (Dataset, List, ...)

    Cordialement,
    Bacube

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2011
    Messages
    453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 453
    Par défaut
    Si tu nous montrait ton code de tri se serait plus facile de t'aider je pense, sinon tu peux essayer ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For Each i As String In maCb2.Items
                If Not i.StartsWith(maCb1.Text) Then
                    maCb2.Items.Remove(i)
                End If
            Next
    P.S: j'ai mis string parce que je ne sais pas quel est le type que tu utilises, mais en adaptant ça marche avec tout

    EDIT: oups, en relisant je vois que la collection va changer et que tu ne pourras pas continuer la boucle...

    Essais plutôt ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim liste As New List(Of String)
            For Each i As String In maCb2.Items
                If i.StartsWith(maCb1.Text) Then
                    liste.Add(i)
                End If
            Next
            maCb2.DataSource = liste

  3. #3
    Inactif
    Homme Profil pro
    Auteur logiciels et romans
    Inscrit en
    Février 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Auteur logiciels et romans
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Février 2009
    Messages : 203
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      dim i as integer
      listbox1.items.clear ' résultat de recherche
      for i = 0 to combobox2.items.count - 1
        if mid(combobox1.selectedindex, 1, 3) = mid(combobox2.items(i), 1, 3) then listbox1.items.add(combobox2.items(i))
      next i
    Je l'ai fait à main levé, il peut y avoir des erreurs...

    Pour le fichier, on peut en effet le lire directement du disque au combo (voir fichier, lecture)...

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 81
    Par défaut
    Bonjour,

    Merci pour votre aide !

    J'ai essaié de tourner les différents codes que vous m'avaient montré pour l'intégrer dans mon programme, mais le fait que je passe par un DataTable n'aide pas... Cela produit une erreur du fait qu'il ne peut convertit un DataRowView en List(Of String).

    Dans ce cas vaut mieux intégrer le fichier Texte directement en List ? Ou Créer un filtre pour résoudre le problème ?


    Pour ma part, je me suis intéressé au filtrage à l'intérieur du DataTable, mais sans grand succès aussi...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub ComboBoxTypeRoulement_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBoxTypeRoulement.SelectedIndexChanged
     
    Dim dtSKF As New DataTable
    Dim filterView As DataView = New DataView(dtSKF)
    Dim colFilter = dtSKF.Select(dtSKF.Columns.Items(0).ColumnName().SubString(1,3)
     
    dtSKF = OuvrirCatalogueSKF()
     
    filterView.RowFilter = colFilter & "=" & ComboBoxTypeRoulement.Text
     
     
    ComboBoxReference.DataSource = filterView
     
    End Sub

    Ce code pose problème. Même le Nom de la colonne est coupée par la fonction SubString, donc ne trouve pas le nom de la colonne. Et je n'ai pas réussi à sauter cette lecture, donc de démarrer après le nom de la colonne.

    J'ai aussi testé


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub ComboBoxTypeRoulement_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBoxTypeRoulement.SelectedIndexChanged
     
    Dim dtSKF As New DataTable
     
    dtSKF = OuvrirCatalogueSKF()
     
    ComboBoxReference.DataSource = dtSKF.Select(dtSKF.Columns.Items(0).ColumnName().SubString(1,3) & "=" & "'" & ComboBoxTypeRoulement.Text & "'")
     
    End Sub
    Même problème qu'au dessus le nom de la colonne est coupé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
    Private Sub ComboBoxTypeRoulement_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBoxTypeRoulement.SelectedIndexChanged
     
    Dim dtSKF As New DataTable
    Dim filterView As DataView = New DataView(dtSKF)
    Dim colFilter = Dim colFilter = dtSKF.Columns.Item(0).ColumnName
     
    dtSKF = OuvrirCatalogueSKF()
     
    filterView.RowFilter = colFilter.StartsWith(ComboBoxTypeRoulement.Text
    ) & "=" & True)
     
    ComboBoxReference.DataSource = filterView
     
    End Sub
    Ici je n'arrive pas à comprendre pourquoi ici le filtre ne marche pas, car la fonction StartsWith retourne un True/False, donc devrait être opérationnelle. Il doit manquer quelque(s) chose(s), ou compare aussi le Nom de la colonne ce qui pose problème...
    Ce filtrre supprime la collection du ComboBoxReference, donc filtre mais pas correctement ...



    Alors questions :

    Est ce que la syntaxe des filtres est correcte ? Ou je m'y prend mal (Fort possible) ?

    Le fait de travailler non pas sur une List, mais sur un DataTable peut poser des soucis ?

    Vaut mieux filtrer le DataTable au moment ou il reprend les données ?


    Cordialement,
    Bacube

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 81
    Par défaut
    Bonjour à tous,


    J'ai trouvé une solution à mon problème. Je là mets si ça peut aider d'autre personnes.

    Tout d'abord le fait d'avoir utilisé une DataTable ne m'a pas permis d'utiliser les méthodes décritent ci-dessus. J'ai alors fait un tri au moment de l'intégration du fichier .txt dans le DataTable.

    Au moment de la lecture du champ qui m'intéresse, je mets une fonction If, qui va me permettre de savoir si la référence démarre par ce que je souhaite ou non. Ensuite, j'intègre ou non le résultat dans la collection de la ComboBox.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Case 1
        dr(0) = CType(champCourant, String)
        If Not IsNothing(typeRoulement) Then
           If CType(champCourant, String).StartsWith(typeRoulement) = True Then
           FenetreDeCalcul.ComboBoxReference.Items.Add(champCourant)
           End If
        End If

    Pour des soucis de collection de la ComboBox, je l'initialise dans le formulaire avant de lancer la procédure de cette façon, car j'utilise soit le DataSource, soit les Items, a défaut d'avoir trouvé un filtre sur la DataTable efficace.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ComboBoxRéférence.DataSource = Nothing
     ComboBoxRéférence.Items.Clear()

    Cette méthode n'est surment pas la meilleure, mais elle me dépannera en attendant de trouver mieux.


    Si vous avez une méthode plus pro je reste preneur.



    Cordialement,
    Bacube

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

Discussions similaires

  1. [XL-2013] Remplacer une Combobox par une textbox dans un Userfrom
    Par joel50 dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 30/10/2014, 16h55
  2. Réponses: 2
    Dernier message: 18/06/2009, 15h09
  3. Réponses: 4
    Dernier message: 31/10/2007, 20h27
  4. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48
  5. masquer une partie d'une vidéo par une banniere
    Par lezabour dans le forum Général Conception Web
    Réponses: 1
    Dernier message: 16/10/2006, 16h47

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