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