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 6 et antérieur Discussion :

Pb pour parcourir une Datagrid Sheridan SSDBGrid


Sujet :

VB 6 et antérieur

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 328
    Points : 695
    Points
    695
    Par défaut Pb pour parcourir une Datagrid Sheridan SSDBGrid
    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

  2. #2
    Membre expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Points : 3 696
    Points
    3 696
    Par défaut
    Une idée comme çà en pasant
    Pourqoui ne pas faire la recherche sur un clone de ton datacontrol ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Recherche()
      Dim Rs As recorset
      Set Rs = Data1.Recordset.Clone
        'ici la recherche
      Rs.Close
    End Sub
    En général, on ne demande de conseils que pour ne pas les suivre ou, si on les a suivis, reprocher à quelqu'un de les avoir donnés
    (ALEXANDRE DUMAS)

    N'hésitez pas à visiter ma page de contributions

  3. #3
    Membre averti
    Homme Profil pro
    Développeur VB6 et tout neuf en .Net
    Inscrit en
    Avril 2005
    Messages
    377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VB6 et tout neuf en .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 377
    Points : 446
    Points
    446
    Par défaut
    Bonjour hn2k5,

    Avant de lire ton tableau fais un sdgInFlightFailureAfm.Update ou sdgInFlightFailureAfm.Refresh. Cela améliore souvent la situation.

    As-tu regarder la propriété CellText ? Qu'elles sont les valeurs ?

    Le second code avec CellValue ne change pas la ligne courante, tu n'a donc pas besoin de mémoriser (puis réstaurer) la position courante.
    Le plus difficile pour trouver une bonne réponse, c'est déjà de trouver la bonne question.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 328
    Points : 695
    Points
    695
    Par défaut
    Tout d'abord merci pour vos réponses.
    J'ai donc essayé vos conseils mais rien n'y fait.
    Je ne peux pas/ne sais pas cloner ce contrôle. Il me faut en effet faire les recherches exactement sur la 2e colonne qui contient les checkboxes.
    Les valeurs retournées par CellText sont tout aussi étranges.
    En fait, je me demande à quel moment cet évènement est déclenché. J'ai glissé une messagebox qui m'affiche la valeur de chaque colonne à chaque ligne.
    Par ex:
    Au clic sur la checkbox de la 1e ligne, toutes les valeurs sont à '0' et ma messagebox s'affiche avant que la checkbox soit redessinée cochée.
    Au clic sur la checkbox de la 2e ligne, toutes les valeurs sont '0' et ma messagebox s'affiche avant que la checkbox soit redessinée cochée.
    Je viens d'essayer de mettre un refresh au début de ma boucle, rien ne change au niveau de l'affichage des valeurs.
    Je me demande donc si cet évènement Change survient avant ou après le changement de valeur de ma checkbox.
    J'ai l'impression que le changement de la valeur de la checkbox arrive après l'évènement sdgDatagrid_Change(), ce qui m'embête légèrement...
    Merci d'avance pour votre aide.
    Bonne journée

  5. #5
    Membre averti
    Homme Profil pro
    Développeur VB6 et tout neuf en .Net
    Inscrit en
    Avril 2005
    Messages
    377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VB6 et tout neuf en .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 377
    Points : 446
    Points
    446
    Par défaut
    Voici une procédure que j'utilise avec le Sheridan

    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
     
    Public Sub SdgUpdate(Optional ByRef oSdg As SSDBGrid = Nothing)
      'Met à jour le shéridan passé en paramétre et laisse le curseur au même endroit
      'Cette procédure est utile dans l'événement change du tableau car elle
      ' permet à la touche tab de faire sortir correctement du tableau
      Dim nPos As Integer
      Dim nLng As Integer
     
      If oSdg Is Nothing Then
        If TypeOf Screen.ActiveControl Is SSDBGrid Then
          Set oSdg = Screen.ActiveControl
        Else
          Exit Sub
        End If
      End If
      With oSdg
        nPos = .ActiveCell.SelStart
        nLng = .ActiveCell.SelLength
        .Update
        .ActiveCell.SelStart = nPos
        .ActiveCell.SelLength = nLng
      End With
    End Sub
    Appel cette procédure dans l'événement sdgDatagrid_Change().

    Dis-moi si cela fonctionne mieux après.
    Le plus difficile pour trouver une bonne réponse, c'est déjà de trouver la bonne question.

  6. #6
    Membre averti
    Homme Profil pro
    Développeur VB6 et tout neuf en .Net
    Inscrit en
    Avril 2005
    Messages
    377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VB6 et tout neuf en .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 377
    Points : 446
    Points
    446
    Par défaut
    Regarde aussi si l'événement sdgDatagrid_Change() ne se déclenche pas deux fois de suite; la deuxieme fois ayant la bonne valeur.
    Le plus difficile pour trouver une bonne réponse, c'est déjà de trouver la bonne question.

  7. #7
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Pour tracker des événements successifs, il vaut mieux utiliser le Debug.Print plutôt que les Msgbox.

    Il existe une recommandation de Microsoft à ce sujet.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 328
    Points : 695
    Points
    695
    Par défaut
    Merci à tous,

    Najdar, ton SdgUpdate() poutre !!
    Je l'ai calé dans mon évènement et ça marche du tonnerre.
    Je l'appelle au début de mon évènement et hop! le tour est joué.

    Merci également pour la recommandation du Debug.Print qui m'a fait gagner du temps (il est vrai que je n'y pense pas toujours...) !

    Voici mon code final pour ceux que ca intéresse:
    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
     
    '--------------------------------------------------------------
    Public Sub SdgUpdate(Optional ByRef oSdg As SSDBGrid = Nothing)
      'Met à jour le shéridan passé en paramétre et laisse le curseur au même endroit
      'Cette procédure est utile dans l'événement change du tableau car elle
      ' permet à la touche tab de faire sortir correctement du tableau
      Dim nPos As Integer
      Dim nLng As Integer
     
      If oSdg Is Nothing Then
        If TypeOf Screen.ActiveControl Is SSDBGrid Then
          Set oSdg = Screen.ActiveControl
        Else
          Exit Sub
        End If
      End If
      With oSdg
        nPos = .ActiveCell.SelStart
        nLng = .ActiveCell.SelLength
        .Update
        .ActiveCell.SelStart = nPos
        .ActiveCell.SelLength = nLng
      End With
    End Sub
     
    '--------------------------------------------------------------
    Private Sub sdgDatagrid_Change()
        'Local declarations
        Dim i As Integer
        Dim bAtLeastOneSelected As Boolean
        Dim vBookmark As Variant
     
        'Update SSDBGrid control before checking the checkboxes values
        SdgUpdate
     
        'Look for at least one checked checkbox
        bAtLeastOneSelected = False
        For i = 0 To frm.sdgDatagrid.Rows - 1
            vBookmark = frm.sdgDatagrid.AddItemBookmark(i)
            If frm.sdgDatagrid.Columns(1).CellText(vBookmark) = -1 Then
                bAtLeastOneSelected = True
            End If
        Next i
     
        'Check if at least one item is selected
        frm.txt(0).Visible = bAtLeastOneSelected
        frm.lbl(0).Visible = bAtLeastOneSelected
        frm.lblUnit(0).Visible = bAtLeastOneSelected
     
        'Refresh the datagrid (nécessaire ?)
        frm.sdgDatagrid.Refresh
    End Sub

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 27/02/2021, 16h57
  2. [MySQL] Boucle pour parcourir une table
    Par razorlok dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 28/09/2008, 17h12
  3. [Visiteur] design pattern Visiteur ou Iterateur pour parcourir une arborescence?
    Par mehdiing dans le forum Design Patterns
    Réponses: 1
    Dernier message: 29/05/2008, 17h10
  4. Function pour parcourir une colonne de table
    Par Rgent dans le forum Développement de jobs
    Réponses: 10
    Dernier message: 22/05/2008, 11h26
  5. [AJAX] Menu déroulant dynamique pour parcourir une BD
    Par relena dans le forum Général JavaScript
    Réponses: 14
    Dernier message: 25/03/2007, 17h05

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