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 :

Trier une bindinglist par un de ses composants


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de sibama
    Profil pro
    Inscrit en
    Août 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 150
    Par défaut Trier une bindinglist par un de ses composants
    Bonjour,

    j'ai une classe :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    Friend Class ClassDGVPIPC
     
        ' Cette classe definit l'ensemble des données associées à la définition du DGV PI/PC/Commentaires Calcul
     
        Private _SeqLign As String
        Private _PIPC As String
        Private _CodeEquaLign As Integer
        Private _CodePIPC As String
     
        ' Constructeur
        Friend Sub New(ByVal SeqLign As String, ByVal PIPC As String, ByVal CodeEquaLign As Integer, ByVal CodePIPC As String)
            _SeqLign = SeqLign
            _PIPC = PIPC
            _CodeEquaLign = CodeEquaLign
            _CodePIPC = CodePIPC
        End Sub
     
        ' Accesseurs
        Property SeqLign() As String
            Get
                Return _SeqLign
            End Get
            Set(ByVal Valeur As String)
                _SeqLign = Valeur
            End Set
        End Property
        Property PIPC() As String
            Get
                Return _PIPC
            End Get
            Set(ByVal Valeur As String)
                _PIPC = Valeur
            End Set
        End Property
        Property CodeEquaLign() As Integer
            Get
                Return _CodeEquaLign
            End Get
            Set(ByVal Valeur As Integer)
                _CodeEquaLign = Valeur
            End Set
        End Property
        Property CodePIPC() As String
            Get
                Return _CodePIPC
            End Get
            Set(ByVal Valeur As String)
                _CodePIPC = Valeur
            End Set
        End Property
     
    End Class
    que j'utilise dans une bindinglist
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private MesDonnees As New BindingList(Of ClassDGVPIPC)
    MesDonnees est ensuite utilisé dans un Datagridview, ce qui permet d'avoir une mise à jour automatique du DGV dès que je fais évoluer MesDonnees -> ça, ça marche bien.

    Je viens de me rendre compte que la manière dont j'initialise MesDonnees
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            ' Mise à jour des données du DGV (Comme MesDonnees est BindingList, sa mise à jour met à jour le DGV)
            MesDonnees.Clear()
            NbreLignesReduites = 0
            For Each Data As KeyValuePair(Of Integer, ClassPIPC) In MesPIPCSeq
                If Me.ToolStripButtonPI.Tag And Data.Value.TextePI <> "" Then
                    MesDonnees.Add(New ClassDGVPIPC("S" & MesSeq(Data.Key).Numero, Data.Value.TextePI, Data.Key, "PI"))
                End If
                If Me.ToolStripButtonPC.Tag And Data.Value.TextePC <> "" Then
                    MesDonnees.Add(New ClassDGVPIPC("S" & MesSeq(Data.Key).Numero, Data.Value.TextePC, Data.Key, "PC"))
                End If
            Next
    me pose problème car MesPIPC est ordonné d'une manière différente de celle dont j'ai besoin dans le datagridview.

    En fait il faudrait que MesDonnees soit ordonné par CodeEquaLign croissant.

    Est-ce que je peux faire un espèce de OrderBy (j'ai pas forcement compris comment l'implémenter dans mon cas) de MesDonnees sur lui-même pour le réordonner après l'avoir créé?
    Ou alors faut-il que je modifie ma boucle For Each de manière à ce qu'au moment de la création, au lieu de faire un simple MesDonnees.Add je fasse un ajout à un rang donné?
    Ou est-ce que dans la classe ClassDGVPIPC il faut que j'ajoute un tri, il me semble que j'avais fait ça un jour avec une histoire de dictionary?

    Si quelqu'un peut juste me donner la meilleure des 3 pistes à explorer (ou une autre), merci d'avance.

  2. #2
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour

    Tu as fait un choix de design mal inspiré car BindingList implemente l'interface IBindingList mais la pas fonctionnalité de tri (sorting)....
    Le DataView lui implémente l'interface IBindingList plus le Tri et en bonus le Filtrage,ce qui nécessite de passer par un DataTable dont le DefaultView s'occupe de la corvée....
    Ton class Data est à "relifter" simplement en DataTable + un binding du DGV
    au BindingSource auxiliaire ....

    code exemple .vb:
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    Public Class Form2
        Private rnd As New Random
        Private donnees As New DataTable
        Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim col As DataColumn
     
            col = New DataColumn("Nom", GetType(String))
            donnees.Columns.Add(col)
            col = New DataColumn("Numero", GetType(Integer))
            donnees.Columns.Add(col)
            col = New DataColumn("ID", GetType(String))
            donnees.Columns.Add(col)
     
     
            Dim dr As DataRow = donnees.NewRow
            For i As Integer = 1 To 50
                Dim p As New Person("item" + rnd.Next(1, 20).ToString, rnd.Next(50, 101), rnd.Next(500, 1001).ToString)
     
                dr(0) = "item" + rnd.Next(1, 20).ToString
                dr(1) = rnd.Next(50, 101)
                dr(2) = rnd.Next(500, 1001).ToString
                donnees.Rows.Add(dr)
                dr = donnees.NewRow
     
     
            Next
            BindingSource1.DataSource = donnees.DefaultView
            DataGridView1.DataSource = BindingSource1
     
     
        End Sub
     
        Private Sub chkFilter_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkFilter.CheckedChanged
            If chkFilter.Checked Then
                BindingSource1.Filter = "Nom='item10'"
            Else
                BindingSource1.Filter = Nothing
     
            End If
        End Sub
     
        Private Sub chkSortByNom_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkSortByNom.CheckedChanged
            If chkSortByNom.Checked Then
                BindingSource1.Sort = "Nom ASC"
            Else
                BindingSource1.Sort = Nothing
     
            End If
        End Sub
     
        Private Sub chkSortByNumero_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkSortByNumero.CheckedChanged
            If chkSortByNumero.Checked Then
                BindingSource1.Sort = "Numero DESC"
            Else
                BindingSource1.Sort = Nothing
     
            End If
        End Sub
    End Class
    bon code.......

  3. #3
    Membre confirmé Avatar de sibama
    Profil pro
    Inscrit en
    Août 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 150
    Par défaut
    Bonjour Mabrouki,

    Merci pour ta réponse, ça pique un peu de se rendre compte qu'on c'est planté sur certains choix, mais comme je me considère comme programmateur amateur et que tu l'annonces avec pas mal de pincettes, ça passe bien.

    Je pense avoir bien compris ton code et je vois l'avantage de ce que tu me proposes.

    Pour ce qui est du filtre, j'avais déjà géré le coup sur le principe du code qui suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
               ' Requete de filtration
                Dim MonFiltre = From MaData In MesDonnees Where (MaData.PIPC.ToLower.Contains(MesFiltres(0).ToLower) And MaData.PIPC.ToLower.Contains(MesFiltres(1).ToLower) And MaData.PIPC.ToLower.Contains(MesFiltres(2).ToLower) And MaData.PIPC.ToLower.Contains(MesFiltres(3).ToLower) And MaData.PIPC.ToLower.Contains(MesFiltres(4).ToLower)) Or (MaData.SeqLign.ToLower.Contains(MesFiltres(0).ToLower) And MaData.SeqLign.ToLower.Contains(MesFiltres(1).ToLower) And MaData.SeqLign.ToLower.Contains(MesFiltres(2).ToLower) And MaData.SeqLign.ToLower.Contains(MesFiltres(3).ToLower) And MaData.SeqLign.ToLower.Contains(MesFiltres(4).ToLower))
    le coup du Mesfiltres(x).tolower c'est pour saisir un filtre jusqu'à 5 chaines de caractères indépendantes dans la zone de saisie associée.

    J'avoue avoir un peu continué à bricoler sur mon code avant d'avoir vu ta réponse, ce qui fait que je m'en suis sorti avec ça:
    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
           ' Mise à jour des données du DGV (Comme MesDonnees est BindingList, sa mise à jour met à jour le DGV)
            MesDonnees.Clear()
            NbreLignesReduites = 0
            For Each Data As KeyValuePair(Of Integer, ClassPIPC) In MesPIPCSeq
                If Me.ToolStripButtonPI.Tag And Data.Value.TextePI <> "" Then
                    i = 0
                    While i < MesDonnees.Count AndAlso MesDonnees.ElementAt(i).CodeEquaLign <= Data.Key
                        i += 1
                    End While
                    MesDonnees.Insert(i, (New ClassDGVPIPC("S" & MesSeq(Data.Key).Numero, Data.Value.TextePI, Data.Key, "PI")))
                End If
     
                If Me.ToolStripButtonPC.Tag And Data.Value.TextePC <> "" Then
                    i = 0
                    While i < MesDonnees.Count AndAlso MesDonnees.ElementAt(i).CodeEquaLign <= Data.Key
                        i += 1
                    End While
                    MesDonnees.Insert(i, (New ClassDGVPIPC("S" & MesSeq(Data.Key).Numero, Data.Value.TextePC, Data.Key, "PC")))
                End If
            Next
    Je suis bien conscient que c'est loin d'être super efficace, les boucles en While ne me satisfont que parce que ce DGV a un nombre de ligne réduite et donc re-parcourir l'ensemble des lignes n'est pas trop chronophage. Autant je suis super content quand je trouve un truc comme ma requête de filtre autant là je me dit que c'est du bricolage, mais bon ça marche....

    Merci d'avoir mis un exemple, moi c'est le genre de trucs qui m'aident bien à comprendre (je garde dans un coin, mon petit projet va contenir d'autres DGV ou je vais pouvoir utiliser ta solution).

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

Discussions similaires

  1. trier une matrice par ses colonnes
    Par Alex999 dans le forum C#
    Réponses: 2
    Dernier message: 12/12/2011, 12h43
  2. trier une ComboBox par ordre alphabétique
    Par poussin_44 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 11/07/2007, 17h23
  3. Réponses: 1
    Dernier message: 13/06/2007, 22h36
  4. Trier une colonne par date
    Par foobar42 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 11/07/2006, 17h46
  5. [C#] Trier une Hashtable par les valeurs
    Par Joad dans le forum ASP.NET
    Réponses: 4
    Dernier message: 25/04/2005, 16h29

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