Bonjour à toutes et à tous,
Je suis en train de debugguer une appli codée en VB6 et utilisant les contrôles Data Widgets 3.1. J'ai une fenêtre assez simple contenant une SSDBGrid, formée de 2 colonnes: | Nom | Checkbox |.
Lorsque je coche une checkbox, il faut que je parcoure toutes les checkbox de la 2e colonne afin de savoir si au moins une est cochée.
Si une des checkboxes est cochée, il me faut afficher divers contrôles (label, textbox). Si aucune des checkboxes n'est cochée, je masque ces contrôles.
La méthode utilisée auparavant parcourait correctement la datagrid mais modifiait la ligne courante en faisant la recherche et se retrouvait directement à la dernière ligne.
J'ai donc modifié le code pour enregistrer la ligne courante avant la recherche.
Il me faut cependant effectuer cette opération sans que la scrollbar bouge, c'est-à-dire parcourir la datagrid sans changer la ligne courante.
Après de nombreuses poignées de cheveux arrachées , je me tourne vers vous.
Voici le code que j'ai modifié mais qui change encore la ligne courante mais la replace à la fin:
Voici le code que je viens de tenter avec GetBookmark():
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 Private Sub sdgDatagrid_Change() 'Local declarations Dim i As Integer Dim bAtLeastOneSelected As Boolean Dim iCurrentRow As Integer Dim iAbsCurrentRow As Integer Dim vBookmark As Variant 'Memorize current row iCurrentRow = frm.sdgDatagrid.Row 'Memorize absolute current row iAbsCurrentRow = frm.sdgDatagrid.AddItemRowIndex( _ frm.sdgDatagrid.Bookmark) bAtLeastOneSelected = False For i = 0 To frm.sdgDatagrid.Rows - 1 frm.sdgDatagrid.Bookmark = frm.sdgDatagrid.AddItemBookmark(i) If frm.sdgDatagrid.Columns(1).Value = -1 Then bAtLeastOneSelected = True End If Next i 'Check if at least one item is selected frm.txt(0).Visible = bAtLeastOneSelected frm.lbl1(0).Visible = bAtLeastOneSelected frm.lbl2(0).Visible = bAtLeastOneSelected 'Select absolute current row frm.sdgDatagrid.Bookmark = _ frm.sdgDatagrid.AddItemBookmark(iAbsCurrentRow - iCurrentRow) 'Select current row frm.sdgDatagrid.Row = iCurrentRow frm.sdgDatagrid.Refresh End Sub
Lorsque je coche au moins une case, les contrôles s'affichent correctement
Lorsque je décoche toutes les cases, les contrôles ne disparaissent pas
Merci d'avance et bonne soirée
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 Private Sub sdgDatagrid_Change() 'Local declarations Dim i As Integer Dim bAtLeastOneSelected As Boolean Dim iCurrentRow As Integer Dim iAbsCurrentRow As Integer Dim vBookmark As Variant 'Memorize current row iCurrentRow = frm.sdgDatagrid.Row 'Memorize absolute current row iAbsCurrentRow = frm.sdgDatagrid.AddItemRowIndex( _ frm.sdgDatagrid.Bookmark) bAtLeastOneSelected = False For i = 0 To frmInFlightFailureAfm.sdgInFlightFailureAfm.Rows - 1 vBookmark = sdgInFlightFailureAfm.GetBookmark(i) 'Ici la valeur retournée par CellValue (variant) est étrange, 'La valeur retournée n'est jamais conforme aux "lois" d'une checkbox: des fois une case cochée vaut 0, des fois -1 'Conversions essayées: '--> If CBool(sdgInFlightFailureAfm.Columns(1).CellValue(vBookmark)) = False Then '--> If CStr(sdgInFlightFailureAfm.Columns(1).CellValue(vBookmark)) = False Then '--> If CLng(sdgInFlightFailureAfm.Columns(1).CellValue(vBookmark)) = 0 Then If CBool(sdgInFlightFailureAfm.Columns(1).CellValue(vBookmark)) = False Then bAtLeastOneSelected = True End If Next i 'Check if at least one item is selected frm.txt(0).Visible = bAtLeastOneSelected frm.lbl1(0).Visible = bAtLeastOneSelected frm.lbl2(0).Visible = bAtLeastOneSelected 'Select absolute current row frm.sdgDatagrid.Bookmark = _ frm.sdgDatagrid.AddItemBookmark(iAbsCurrentRow - iCurrentRow) 'Select current row frm.sdgDatagrid.Row = iCurrentRow frm.sdgDatagrid.Refresh End Sub
Partager