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:
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 |