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 :

Pb de rafraichissement de DataGridView


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2010
    Messages : 22
    Points : 17
    Points
    17
    Par défaut Pb de rafraichissement de DataGridView
    Bonsoir,

    Je rencontre un petit problème : après avoir affecté des DataTables dans des GridView, j'édite le style des lignes en fct de certains critères.
    Malheureusement ces modifs n'ont pas l'air d'être prises en considération. Mon programme initial est assez complexe et fait appel à des requêtes SQL.

    Du coup, j'ai écrit un petit bout de code pour montrer mon soucis (ce exemple est complet et peut être exécuté tel quel)...

    Il y a 2 choses qui me chiffonne :

    1- Dans le Form_load : après avoir affecté la DataTable en source, la méthode count du GridView me renvoie 0. Dans le form_load, les modifs dans les cellules ou sur le style, ne sont pas prises en compte.

    2- Une fois que le timer se déclenche, la page active est mise à jour mais pas les autres. Si on clique par exemple sur la page 5 avant le timer, la page 5 est rafraichie mais aussi la page 1 (qui elle, n'est pas active). Les autres pages restent avec le texte en noir...

    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
    Public Class Form1
        Private Clock As New Timer
     
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Dim TabCtrl As New TabControl With {.Padding = New Point(14, 10), .Dock = DockStyle.Fill}
            AddHandler Clock.Tick, AddressOf ClockEvent
     
            For i = 1 To 5 ' Création de 5 pages
                Dim p As New TabPage With {.Text = "Page_" + i.ToString}
                With p
                    Dim dtaTable As New DataTable("Essai" + i.ToString)
                    Dim dtaView As New DataGridView With {.Dock = DockStyle.Fill, .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill}
     
                    For j = 1 To 3
                        dtaTable.Columns.Add("Col_" + j.ToString)
                    Next j
                    For k = 0 To 15
                        dtaTable.Rows.Add("Nom " + i.ToString + k.ToString, "Prenom " + i.ToString + k.ToString, Now())
                    Next k
     
                    dtaView.DataSource = dtaTable
     
                    ' Ceci ne fonctionne pas car dtaView.Rows.Count = 0... pourquoi ?
                    ' Par contre, dans la methode du timer, rows.count = 17 dans chaque grid
                    For Each row As DataGridViewRow In dtaView.Rows
                        If (row.Index And 1) = 1 Then row.DefaultCellStyle.ForeColor = Color.Red
                    Next
                    p.Controls.Add(dtaView)
                End With
                TabCtrl.TabPages.Add(p) ' Ajout de la page
            Next
            Me.Controls.Add(TabCtrl) ' Ajout du TabControl dans le form
     
            ' on lance le timer pour le test
            Clock.Interval = 3000
            Clock.Start()
        End Sub
     
        Private Sub ClockEvent()
            Dim dtaView As DataGridView
            Dim NbPage As Integer = CType(Me.Controls.Item(0), TabControl).TabPages.Count
            Me.Text = "NbPage:" + NbPage.ToString + " Nb de lignes dans les GridView : "
     
            ' On passe toutes les lignes de chaque grid en rouge
            For i = 0 To NbPage - 1
                dtaView = CType(Me.Controls.Item(0), TabControl).TabPages(i).Controls(0)
                For Each row As DataGridViewRow In dtaView.Rows
                    row.DefaultCellStyle.ForeColor = Color.Red
                Next
                ' le nb de ligne dans les grid est correct alors qu'il ne l'etait pas dans le form_load
                Me.Text += dtaView.Rows.Count.ToString + ","
            Next i
            Clock.Stop()
        End Sub
     
     
    End Class

  2. #2
    Membre à l'essai
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2010
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    Bonjour,

    J'ai fini par trouver la solution…

    Pour ceux que cela intéresse la voici :
    En résumé, l'ordre dans lequel on ajoute des controls dans la form est très important.

    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
     
    Public Class Form1
        Private Clock As New Timer
     
     
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Dim TabCtrl As New TabControl With {.Padding = New Point(14, 10), .Dock = DockStyle.Fill}
            Me.Controls.Add(TabCtrl) ' Ajout du TabControl dans le form
     
            For i As Integer = 1 To 5 ' Création de 5 pages
                ' Cet ordre est très important
                Dim dtaView As DataGridView = New DataGridView With {.Dock = DockStyle.Fill, .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill}
                Dim tPage As New TabPage With {.Text = "Page_" + i.ToString}
                tPage.Controls.Add(dtaView)
                TabCtrl.TabPages.Add(tPage) ' Ajout de la page
     
                Dim dtaTable As DataTable = New DataTable("Essai" + i.ToString)
                For j As Integer = 1 To 3
                    dtaTable.Columns.Add("Col_" + j.ToString)
                Next j
                For k As Integer = 0 To 15
                    dtaTable.Rows.Add("Nom " + i.ToString + k.ToString, "Prenom " + i.ToString + k.ToString, Now())
                Next k
     
                With dtaView
                    .DataSource = dtaTable
                    .SelectionMode = DataGridViewSelectionMode.FullRowSelect
                    .AlternatingRowsDefaultCellStyle.BackColor = Color.FromArgb(192, 255, 192) ' pour le fun 
                End With
     
                For Each row As DataGridViewRow In dtaView.Rows
                    If (row.Index Mod 3) = 0 Then row.DefaultCellStyle.ForeColor = Color.Red
                    row.Cells.Item(0).Value = "toto"
                Next
                dtaTable = Nothing
                dtaView = Nothing
            Next
     
            ' on lance le timer pour le test
            AddHandler Clock.Tick, AddressOf ClockEvent
            Clock.Interval = 5000
            Clock.Start()
        End Sub
     
        Private Sub ClockEvent()
            For i As Integer = 0 To CType(Me.Controls(0), TabControl).TabPages.Count - 1
                RafrDGV(i)
            Next
            Clock.Stop()
        End Sub
     
        Private Sub RafrDGV(Optional ByVal Id As Integer = -1)
            Dim dtaView As DataGridView
     
            With CType(Me.Controls(0), TabControl) ' on pointe sur le tabControl
                If Id = -1 Then Id = .SelectedIndex
                dtaView = .TabPages(Id).Controls(0)
                For Each row As DataGridViewRow In dtaView.Rows
                    If (row.Index Mod 3) = 0 Then ' un test quelconque pour l'exemple
                        row.DefaultCellStyle.ForeColor = Color.Red
                        row.Cells.Item(0).Value = (Id + 1).ToString + "_titi"
                    End If
                Next
            End With
        End Sub
     
    End Class

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 29/06/2010, 10h36
  2. Rafraichissement de la liste d'un datagridview
    Par inforlab dans le forum Windows Forms
    Réponses: 19
    Dernier message: 19/11/2008, 23h41
  3. Rafraichissement d'une dataGridView
    Par boullery dans le forum ASP.NET
    Réponses: 9
    Dernier message: 12/07/2007, 09h56
  4. Rafraichissement d'un DataGridView
    Par hdd dans le forum Windows Forms
    Réponses: 1
    Dernier message: 08/02/2007, 11h44

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