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 :

Variable de class et type anonyme


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut Variable de class et type anonyme
    Hello,

    Voici une Sub d'un formulaire.
    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 btnFilter_Click(sender As Object, e As EventArgs) Handles btnFilter.Click
            Dim data = (From d In Promo.DTO.DetailsDemo
                        Select Id = d.Id, Department = d.CodeDemo.Department, CodeDemo = d.CodeDemo, Percentage = d.Percentage, Description = d.Description, Note = d.Note, ListType = d.ListType).Concat(
                        From d In Promo.DTO.DetailsDepartment
                        Select Id = d.Id, Department = d.Department, CodeDemo = CType(Nothing, PROMO_DTO.CodeDemo), Percentage = d.Percentage, Description = d.Description, Note = d.Note, ListType = d.ListType)
     
            If ckbDepartment.Checked Then
                data = (From d In data
                        Where d.Department.Id = CShort(cbDepartment.SelectedValue)
                        Select d)
            End If
     
            If ckbConcession.Checked Then
                data = (From d In data
                        Where d.CodeDemo.Id = CInt(cbConcession.SelectedValue)
                        Select d)
            End If
     
            If ckbPercent.Checked Then
                data = (From d In data
                        Where d.Percentage = nudPercent.Value
                        Select d)
            End If
     
            dgvDemo.DataSource = data.ToList
        End Sub
    Ce que je cherche à faire est de déclarer data en tant que variable de classe histoire de pouvoir l'utiliser dans une autre Sub tout en gardant les filtres s'il y en a eu.

    Par contre, il faut lui donner un type du coup à cette variable. Et c'est là que je coince. Aucune idée de ce qu'il faut mettre vu que c'est un type anonyme...

    Je viens donc quémander des idées.

    Merci d'avance !

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    tu peux faire une classe avec toutes ces propriétés, et faire un select new machin with {... idem}
    ta classe n'est plus anonyme mais au moins elle est utilisable

    sinon faire une sub dans la sub (new action() sub () code end sub ())).invoke
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    J'aurais aimé pouvoir me passer de créer une classe de plus juste pour faire un affichage.

    Pourrais-tu développer un peu plus ton histoire de sub dans une sub ?? J'ai pas bien compris (encore jamais fait ça).

    Ou m'indiquer des mots clefs pour demander à google.

    Sinon, je viens de trouver que, en C#, on peut utiliser le type Dynamic mais il n'y a apparemment pas d'équivalent en VB. C'est la première fois que je tombe sur un truc faisable en C# et pas en VB .

  4. #4
    Membre Expert Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Par défaut
    Au début Pol63 proposait de créer une classe contenant plutôt les filtre que l'objet en lui même. Ce qui revient au même.

    Pas trop suivi sur le New Sub Invoke (il faudrait que je me penche dessus).

    Sinon, à la question initiale, le type "mère" qui peut tout contenir est le type Object.

    Si tu stockes un objet de type Type1 et que tu souhaites accéder a ses propriétés, alors il faudra faire un (Direct)Cast dessus pour qu'il l'objet retrouve son type d'origine.

  5. #5
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Sauf que si je fais Dim data As Object, je vais pouvoir lui filer la query mais c'est mort pour appliquer les filtres après. Vu qu'il s'agit d'un type anonyme, hors de question de faire un cast .

  6. #6
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Autre possibilité, parvenir à convertir data.ToList en BindingList ^^.

    Vu qu'en fait c'est pour pouvoir faire des tris sur les colonnes d'un DataGridView, si je parviers à lui passer un objet qui implémente IBindingList, ça marche aussi. Et plus besoin de data en variable de classe dans ce cas.

    Mais pareil que pour la question originelle, je sèche...

  7. #7
    Membre émérite Avatar de worm83
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Février 2010
    Messages
    459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2010
    Messages : 459
    Par défaut
    Citation Envoyé par Kropernic Voir le message
    Hello,

    Voici une Sub d'un formulaire.
    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 btnFilter_Click(sender As Object, e As EventArgs) Handles btnFilter.Click
            Dim data = (From d In Promo.DTO.DetailsDemo
                        Select Id = d.Id, Department = d.CodeDemo.Department, CodeDemo = d.CodeDemo, Percentage = d.Percentage, Description = d.Description, Note = d.Note, ListType = d.ListType).Concat(
                        From d In Promo.DTO.DetailsDepartment
                        Select Id = d.Id, Department = d.Department, CodeDemo = CType(Nothing, PROMO_DTO.CodeDemo), Percentage = d.Percentage, Description = d.Description, Note = d.Note, ListType = d.ListType)
     
            If ckbDepartment.Checked Then
                data = (From d In data
                        Where d.Department.Id = CShort(cbDepartment.SelectedValue)
                        Select d)
            End If
     
            If ckbConcession.Checked Then
                data = (From d In data
                        Where d.CodeDemo.Id = CInt(cbConcession.SelectedValue)
                        Select d)
            End If
     
            If ckbPercent.Checked Then
                data = (From d In data
                        Where d.Percentage = nudPercent.Value
                        Select d)
            End If
     
            dgvDemo.DataSource = data.ToList
        End Sub
    Ce que je cherche à faire est de déclarer data en tant que variable de classe histoire de pouvoir l'utiliser dans une autre Sub tout en gardant les filtres s'il y en a eu.

    Par contre, il faut lui donner un type du coup à cette variable. Et c'est là que je coince. Aucune idée de ce qu'il faut mettre vu que c'est un type anonyme...

    Je viens donc quémander des idées.

    Merci d'avance !
    La définition d'un type anonyme est justement que celui-ci n'est connu que dans le scope de la fonction ou il est déclarer. Sinon ce n'est plus un type anonyme. Tu ne peux pas faire ce que tu demande, c'est sa définition même.

    en revanche tu peux faire de la réfléxion ou utiliser un type dynamic.

  8. #8
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Hello,

    J'ai finalement résolu mon souci comme ceci :
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
        Private _dicFilter As Dictionary(Of Filter, Decimal)
        Private Enum Filter As Integer
            Department = 1
            Demo = 2
            Percent = 3
        End Enum
     
        Private Sub btnFilter_Click(sender As Object, e As EventArgs) Handles btnFilter.Click
            _dicFilter = New Dictionary(Of Filter, Decimal)
     
            If ckbDepartment.Checked Then
                _dicFilter.Add(Filter.Department, CShort(cbDepartment.SelectedValue))
            End If
     
            If ckbConcession.Checked Then
                _dicFilter.Add(Filter.Demo, CInt(cbConcession.SelectedValue))
            End If
     
            If ckbPercent.Checked Then
                _dicFilter.Add(Filter.Percent, nudPercent.Value)
            End If
     
            FilterAndSortData(_dicFilter)
        End Sub
     
        Private Sub FilterAndSortData(filters As Dictionary(Of Filter, Decimal), Optional ByVal PropertyToSort As String = Nothing, Optional ByVal sortorder As SortOrder = Nothing)
            Dim data = (From d In Promo.DTO.DetailsDemo
                       Select Id = d.Id, Department = d.CodeDemo.Department, CodeDemo = d.CodeDemo, Percentage = d.Percentage, Description = d.Description, Note = d.Note, ListType = d.ListType).Concat(
                       From d In Promo.DTO.DetailsDepartment
                       Select Id = d.Id, Department = d.Department, CodeDemo = CType(Nothing, PROMO_DTO.CodeDemo), Percentage = d.Percentage, Description = d.Description, Note = d.Note, ListType = d.ListType)
     
            If Not IsNothing(filters) Then
                For Each key As Filter In filters.Keys
                    Select Case key
                        Case Filter.Department
                            data = (From d In data
                                    Where d.Department.Id = _dicFilter(key)
                                    Select d)
                        Case Filter.Demo
                            data = (From d In data
                                    Where d.CodeDemo.Id = _dicFilter(key)
                                    Select d)
                        Case Filter.Percent
                            data = (From d In data
                                    Where d.Percentage = _dicFilter(key)
                                    Select d)
                    End Select
                Next
            End If
     
     
            If Not IsNothing(PropertyToSort) Then
                If sortorder = Windows.Forms.SortOrder.Ascending Then
                    Select Case PropertyToSort
                        Case "Department"
                            data = data.OrderBy(Function(x) x.Department.Code)
                        Case "CodeDemo"
                            data = data.OrderBy(Function(x) x.CodeDemo.Code)
                        Case "Percentage"
                            data = data.OrderBy(Function(x) x.Percentage)
                        Case "Description"
                            data = data.OrderBy(Function(x) x.Description)
                        Case "Note"
                            data = data.OrderBy(Function(x) x.Note)
                        Case "ListType"
                            data = data.OrderBy(Function(x) x.ListType)
                    End Select
                ElseIf sortorder = Windows.Forms.SortOrder.Descending Then
                    Select Case PropertyToSort
                        Case "Department"
                            data = data.OrderByDescending(Function(x) x.Department.Code)
                        Case "CodeDemo"
                            data = data.OrderByDescending(Function(x) x.CodeDemo.Code)
                        Case "Percentage"
                            data = data.OrderByDescending(Function(x) x.Percentage)
                        Case "Description"
                            data = data.OrderByDescending(Function(x) x.Description)
                        Case "Note"
                            data = data.OrderByDescending(Function(x) x.Note)
                        Case "ListType"
                            data = data.OrderByDescending(Function(x) x.ListType)
                    End Select
                End If
            End If
     
            dgvDemo.DataSource = data.ToList
        End Sub
     
        Private Sub dgvDemo_ColumnHeaderMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles dgvDemo.ColumnHeaderMouseClick
            Dim order As SortOrder = dgvDemo.Columns(e.ColumnIndex).HeaderCell.SortGlyphDirection
            If order = SortOrder.None OrElse order = SortOrder.Descending Then
                FilterAndSortData(_dicFilter, dgvDemo.Columns(e.ColumnIndex).DataPropertyName, SortOrder.Ascending)
                dgvDemo.Columns(e.ColumnIndex).HeaderCell.SortGlyphDirection = SortOrder.Ascending
            Else
                FilterAndSortData(_dicFilter, dgvDemo.Columns(e.ColumnIndex).DataPropertyName, SortOrder.Descending)
                dgvDemo.Columns(e.ColumnIndex).HeaderCell.SortGlyphDirection = SortOrder.Descending
            End If
        End Sub

  9. #9
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    de toute façon tant qu'on reste dans du code trop concret on est obligé d'y rester (ca ne veut rien dire )
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

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

Discussions similaires

  1. Variable statique de meme type que la classe qui la contient
    Par MSN9149 dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 09/02/2012, 10h38
  2. Comment exploiter une variable d'une classe de type JFrame
    Par kamala dans le forum Agents de placement/Fenêtres
    Réponses: 8
    Dernier message: 01/07/2011, 16h35
  3. débutant:utilisation de variable entre classe
    Par troojan dans le forum MFC
    Réponses: 1
    Dernier message: 07/12/2005, 23h31
  4. Réponses: 6
    Dernier message: 23/09/2005, 12h54
  5. Variable globale - PL/SQL - %TYPE
    Par ogre dans le forum PL/SQL
    Réponses: 25
    Dernier message: 20/10/2004, 13h47

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