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

Windows Forms Discussion :

[VB.NET] Une colonne d'un DataGridView devient visible sans raison apparente


Sujet :

Windows Forms

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 [VB.NET] Une colonne d'un DataGridView devient visible sans raison apparente
    Hello,

    Dans mon projet actuel j'ai créé un wizard d'encodage pour faciliter la vie aux utilisateurs. Ca fonctionne nickel sauf un truc bizarre dans la forme suivante.
    Code vb : 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
    Public Class frmStep2Demo
     
        Public Property CurrentUser As PROMO_BLL.User
        Public Property PreviousStep As frmStep1
     
        Private _cons As PROMO_BLL.Concessions
        Private _con As PROMO_BLL.Concession
        Public Property SelectedConcessions As PROMO_BLL.Concessions
     
        Public Sub New(user As PROMO_BLL.User, step1 As frmStep1)
     
            ' This call is required by the designer.
            InitializeComponent()
     
            ' Add any initialization after the InitializeComponent() call.
            CurrentUser = user
            PreviousStep = step1
     
            SelectedConcessions = New PROMO_BLL.Concessions
     
            InitDGV()
        End Sub
     
        Private Sub InitDGV()
            Dim index As Integer
            With dgvDemo
                .AutoGenerateColumns = False
                .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
     
                index = .Columns.Add("dgvcId", "Id")
                .Columns(index).DataPropertyName = "Id"
                .Columns(index).Visible = False
     
                index = .Columns.Add("dgvcCode", "Code")
                .Columns(index).DataPropertyName = "Code"
     
                index = .Columns.Add("dgvcDesc", "Description")
                .Columns(index).DataPropertyName = "Description"
            End With
            With dgvSelectedDemo
                .AutoGenerateColumns = False
                .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
     
                index = .Columns.Add("dgvcId", "Id")
                .Columns(index).DataPropertyName = "Id"
                .Columns(index).Visible = False
     
                index = .Columns.Add("dgvcCode", "Code")
                .Columns(index).DataPropertyName = "Code"
     
                index = .Columns.Add("dgvcDesc", "Description")
                .Columns(index).DataPropertyName = "Description"
            End With
        End Sub
     
        Private Sub InitConcessions()
            _cons = PROMO_BLL.Concessions.GetByDepartment(PreviousStep.Department.DTO.Id)
            dgvDemo.DataSource = _cons.DTO.OrderBy(Function(x) x.Code).ToList
            dgvSelectedDemo.DataSource = SelectedConcessions.DTO.OrderBy(Function(x) x.Code).ToList
        End Sub
     
        Private Sub frmStep2Demo_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            InitConcessions()
        End Sub
     
    End Class
    Ici, le code de la classe PROMO_BLL.Concessions :
    Code vb : 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
    Public Class Concessions
        Public Property DTO As List(Of PROMO_DTO.CodeDemo)
     
        Public Sub New()
            Me.DTO = New List(Of PROMO_DTO.CodeDemo)
        End Sub
     
        Public Shared Function GetByDepartment(dep_id As Short) As Concessions
            Dim result As New Concessions
            For Each c As PROMO_DTO.CodeDemo In PROMO_DAL.Concession.GetByDepartment(dep_id)
                result.DTO.Add(c)
            Next
            Return result
        End Function
     
        Public Shared Function GetByBuyDept(ba_id As Byte) As Concessions
            Dim result As New Concessions
            For Each c As PROMO_DTO.CodeDemo In PROMO_DAL.Concession.GetByBuyDept(ba_id)
                result.DTO.Add(c)
            Next
            Return result
        End Function
     
        Public Function GetById(cont_id As Integer) As Concession
            Return New Concession((From c In Me.DTO
                                  Where c.Id = cont_id
                                  Select c).FirstOrDefault)
        End Function
     
        Public Function GetByCode(code As String) As Concession
            Return New Concession((From c In Me.DTO
                                   Where c.Code = code
                                   Select c).FirstOrDefault)
        End Function
    End Class

    Et pour finir, voici le wizard qui affiche, entre autre, ce formulaire (dans le Case 2) :
    Code vb : 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
        Private Function StartWizard(startAtStep As Integer) As Integer
            Dim i As Integer = startAtStep
            If i = 1 Then
                steps = New Dictionary(Of Integer, Form)
            End If
            'showing of encoding wizard
            While Not (i = 0 Or i = 6)
                'initializing the wizard's screens
                Select Case i
                    Case 1
                        If Not steps.Keys.Contains(1) Then
                            steps.Add(1, New frmStep1(CurrentUser))
                        End If
                    Case 2
                        If Not steps.Keys.Contains(2) Then
                            steps.Add(2, New frmStep2Demo(CurrentUser, CType(steps(1), frmStep1)))
                        End If
                    Case 3
                        If Not steps.Keys.Contains(3) Then
                            steps.Add(3, New frmStep3Demo(CurrentUser, CType(steps(2), frmStep2Demo)))
                        Else
                            steps(3) = New frmStep3Demo(CurrentUser, CType(steps(2), frmStep2Demo))
                        End If
                    Case 4
                        Select Case CType(steps(3), frmStep3Demo).Action
                            Case frmStep3Demo.ActionType.List
                                If Not steps.Keys.Contains(4) Then
                                    steps.Add(4, New frmStep4DemoList(CurrentUser, CType(steps(2), frmStep2Demo)))
                                ElseIf Not TypeOf steps(4) Is frmStep4DemoList Then
                                    steps(4) = New frmStep4DemoList(CurrentUser, CType(steps(2), frmStep2Demo))
                                End If
                            Case frmStep3Demo.ActionType.Auto
                                If Not steps.Keys.Contains(4) Then
                                    steps.Add(4, New frmStep4DemoAuto(CurrentUser, New PROMO_BLL.PromoType(Promo.DTO.Type)))
                                ElseIf Not TypeOf steps(4) Is frmStep4DemoAuto Then
                                    steps(4) = New frmStep4DemoAuto(CurrentUser, New PROMO_BLL.PromoType(Promo.DTO.Type))
                                End If
                            Case frmStep3Demo.ActionType.Popup
                                If Not steps.Keys.Contains(4) Then
                                    steps.Add(4, New frmStep4DemoPopUp(CurrentUser, New PROMO_BLL.PromoType(Promo.DTO.Type)))
                                ElseIf Not TypeOf steps(4) Is frmStep4DemoPopUp Then
                                    steps(4) = New frmStep4DemoPopUp(CurrentUser, New PROMO_BLL.PromoType(Promo.DTO.Type))
                                End If
                        End Select
                    Case 5
                        If Not steps.Keys.Contains(5) Then
                            steps.Add(5, New frmFinishDemo(CurrentUser, Me.Promo, CType(steps(1), frmStep1), CType(steps(2), frmStep2Demo), CType(steps(3), frmStep3Demo), steps(4)))
                        Else
                            steps(5) = New frmFinishDemo(CurrentUser, Me.Promo, CType(steps(1), frmStep1), CType(steps(2), frmStep2Demo), CType(steps(3), frmStep3Demo), steps(4))
                        End If
                End Select
                'showing the screens
                Dim result As DialogResult = steps(i).ShowDialog
                If result = Windows.Forms.DialogResult.OK Then
                    i += 1
                ElseIf result = Windows.Forms.DialogResult.Cancel Then
                    i -= 1
                ElseIf result = Windows.Forms.DialogResult.Abort Then
                    i = 0
                End If
            End While
            Return i
        End Function

    Ce formulaire n'est donc instancier qu'une seule fois. L'initialisation des DGV ne se fait qu'une seule fois puisque la sub qui s'en occupe n'est appelée que dans le constructeur du formulaire.
    Or, si j'accède au formulaire et que la propriété DTO de l'instance de PROMO_BLL.Concessions créée par la sub InitConcessions est une liste vide, alors, lors du prochain affichage affichage de ce step (réalisé en retournant au step précédent, en choisissant un autre rayon et en revenant sur ce step), alors, la colonne ID s'affiche dans la DGV nommé dgvDemo.

    Je ne comprends absolument pas pourquoi vu que je ne rend cette colonne visible nullepart !

    Quelqu'un a-t-il déjà rencontré ce genre de bug ?? Une idée de où je dois chercher ??

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Par défaut
    Bonjour,

    Citation Envoyé par Kropernic Voir le message
    Quelqu'un a-t-il déjà rencontré ce genre de bug ?? Une idée de où je dois chercher ??
    J'ai reproduit ton bug, il se produit dans InitConcessions.
    Si la liste est vide il ne faut pas l'affecter au DataSource (je ne sais pas pourquoi, au 2ème passage (liste remplie) dgvDemo.Columns(index).Visible passe à true lors de l'affectation suivante dgvDemo.DataSource = _cons.DTO.OrderBy(Function(x) x.Code).ToList). Apparement, si la liste est vide il réinitialise les colonnes.
    Code vb.net : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Private Sub InitConcessions()
            _cons = PROMO_BLL.Concessions.GetByDepartment(PreviousStep.Department.DTO.Id)
            If _cons.DTO.Count > 0 Then dgvDemo.DataSource = _cons.DTO.OrderBy(Function(x) x.Code).ToList ' test vide
            dgvSelectedDemo.DataSource = SelectedConcessions.DTO.OrderBy(Function(x) x.Code).ToList
        End Sub
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  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
    Je veux bien que ça contourne le problème mais en quoi passé une ligne vide peut changer la valeur d'une propriété ? 0_0

    Ca doit juste juste affiché 0 ligne. Le type d'objet contenu dans la liste (même si sa cardinalité est de 0) correspond bien à ce qui est attendu pour faire le match avec le contenu de DataPropertyName.

    Vraiment, je ne comprends. Et toi non plus à priori vu que tu "ne sais pas pourquoi". Aurait-on mis le doigt sur un bug du framework ??

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Par défaut
    Apparement, si la liste est vide il réinitialise les colonnes.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  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
    Bizarrement, je n'ai pas le même problème avec l'autre DGV qui reçoit les éléments qui ont été sélectionnés dans le premier DGV...

    EDIT :
    En plus, je viens de modifier la sub InitConcessions comme ci-dessous et j'ai toujours le même problème...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        Private Sub InitConcessions()
            _cons = PROMO_BLL.Concessions.GetByDepartment(PreviousStep.Department.DTO.Id)
            If _cons.DTO.Count > 0 Then
                dgvDemo.DataSource = _cons.DTO.OrderBy(Function(x) x.Code).ToList
            Else
                dgvDemo.DataSource = Nothing
            End If
            dgvSelectedDemo.DataSource = SelectedConcessions.DTO.OrderBy(Function(x) x.Code).ToList
        End Sub
    Une autre idée Hervé ?

  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
    Si je mets la colonne récalcitrante en 3e position au lieu de la première, le problème ne se pose plus. C'est quoi ce bordel ??

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/03/2007, 15h31
  2. [VB.NET][VS2005] Locker une colonne d'un Datagridview
    Par olsimare dans le forum Windows Forms
    Réponses: 2
    Dernier message: 26/01/2007, 22h37
  3. [VB.Net 05] Addition dans une colonne d'un DataGridView
    Par collaud_vb dans le forum Windows Forms
    Réponses: 13
    Dernier message: 26/09/2006, 16h53
  4. [VB.NET] Calculs dans une colonne d'un datagridview
    Par boulete dans le forum Windows Forms
    Réponses: 3
    Dernier message: 31/03/2006, 15h11
  5. [VB.NET] une chaine de caractère qui devient une propriete
    Par lucie.houel dans le forum ASP.NET
    Réponses: 8
    Dernier message: 20/09/2005, 14h10

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