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:
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
Voici le code que je viens de tenter avec GetBookmark():
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
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
Merci d'avance et bonne soirée