begin process at 2008 05 16 05:02:47
1 173 215 membres
57 nouveaux aujourd'hui
13 970 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

DATAGRID + CHECKBOX


Information sur la source

Catégorie :Control Classé sous : datagrid, checkbox, ado, zen69, dg cb Niveau : Initié Date de création : 01/04/2008 Date de mise à jour : 04/04/2008 15:15:24 Vu / téléchargé: 3 643 / 513

Note :
Aucune note

Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note

Description

Voici la source du tutoriel :
http://www.vbfrance.com/tutoriaux/DATAGRID-AVEC-CHECKBOX_834.aspx

Comme il m'a été demandé à plusieurs reprise voici donc la source fonctionnel.

Source

  • Option Explicit
  • Private bInSetCheckboxes As Boolean
  • Private Sub Form_Activate()
  • SetCheckboxes 1, cbTest 'Ici 1 représente la 2e colonne du DataGrid
  • End Sub
  • Private Sub SetCheckboxes(ColNdx As Long, ByRef ChkboxArray As Object)
  • bInSetCheckboxes = True
  • On Error GoTo ErrorExit
  • Dim i
  • Dim obj As Object
  • Set obj = dgTest
  • Dim OffsetX As Long, OffsetY As Long
  • If Not ChkboxArray(0).Container Is dgTest.Container Then
  • CalcContainerOffset obj, OffsetX, OffsetY
  • End If
  • On Error Resume Next
  • With dgTest
  • If (ChkboxArray.UBound <> .VisibleRows) Then
  • For i = ChkboxArray.UBound + 1 To .VisibleRows - 1
  • Load ChkboxArray(i)
  • ChkboxArray(i).Width = 190
  • ChkboxArray(i).Height = 190
  • Next
  • For i = .VisibleRows To ChkboxArray.UBound
  • Next
  • End If
  • OffsetX = OffsetX + (.Columns(ColNdx).Width - ChkboxArray(0).Width) / 2
  • OffsetY = OffsetY + 10 ''(.RowHeight - ChkboxArray(0).Height) / 2
  • .Columns(ColNdx).Alignment = dbgCenter
  • .Columns(ColNdx).Locked = True
  • If .LeftCol <= ColNdx Then
  • For i = 0 To .VisibleRows - 1
  • ChkboxArray(i).Value = Abs(.Columns(ColNdx).CellValue(.RowBookmark(i)))
  • ChkboxArray(i).Top = .Top + .RowTop(i) + OffsetY
  • ChkboxArray(i).Left = .Left + .Columns(ColNdx).Left + OffsetX
  • ChkboxArray(i).Visible = True
  • ChkboxArray(i).ZOrder
  • Next
  • Else
  • i = 0
  • End If
  • For i = i To ChkboxArray.UBound
  • ChkboxArray(i).Visible = False
  • Next
  • End With
  • ExitPoint:
  • bInSetCheckboxes = False
  • Exit Sub
  • ErrorExit:
  • Resume ExitPoint
  • End Sub
  • Private Function CalcContainerOffset(obj As Object, ByRef OffsetX As Long, ByRef OffsetY As Long)
  • Do While Not (obj.Container Is obj.Parent)
  • Set obj = obj.Container
  • If Not (obj Is Nothing) Then
  • OffsetX = OffsetX + obj.Left
  • OffsetY = OffsetY + obj.Top
  • If obj.BorderStyle = 1 Then '' fixed single
  • If obj.Appearance = 1 Then '' 3d
  • OffsetX = OffsetX + 30
  • OffsetY = OffsetY + 30
  • Else
  • OffsetX = OffsetX + 15
  • OffsetY = OffsetY + 15
  • End If
  • End If
  • End If
  • If (TypeOf obj Is Form) Or (TypeOf obj Is MDIForm) Then Exit Do
  • Loop
  • End Function
  • Private Sub dgTest_Scroll(Cancel As Integer)
  • SetCheckboxes 1, cbTest 'Ici 1 représente la 2e colonne du DataGrid
  • End Sub
  • Private Sub cbTest_Click(index As Integer)
  • Dim fr As Long
  • On Error Resume Next
  • fr = dgTest.FirstRow
  • With adoTemp.Recordset 'Ici j’utilise un ado mais vous pouvez utilize n’importe quel type de recordset ce bout de code ne doit donc pas être recopié tel quel. Ce code met à jour le champs attaché au checkbox avec la bonne valeur, ce champs doit etre de type boolean donc si vous utilisé SQL SERVER vous devez utilisé un colonne de type BIT.
  • .Filter = "LineID='" & index + fr & "'"
  • .Fields("Include").Value = cbTest(index).Value
  • .UpdateBatch
  • .Filter = "LineID<>''"
  • .Resync
  • End With
  • dgTest.FirstRow = fr
  • 'Fin du code que vous devez adapter.
  • End Sub
Option Explicit

Private bInSetCheckboxes As Boolean

Private Sub Form_Activate()
    SetCheckboxes 1, cbTest        'Ici 1 représente la 2e colonne du DataGrid
End Sub


Private Sub SetCheckboxes(ColNdx As Long, ByRef ChkboxArray As Object)
    bInSetCheckboxes = True
    
    On Error GoTo ErrorExit
    Dim i
    Dim obj As Object
    Set obj = dgTest
    Dim OffsetX As Long, OffsetY As Long
    
    If Not ChkboxArray(0).Container Is dgTest.Container Then
        CalcContainerOffset obj, OffsetX, OffsetY
    End If

    On Error Resume Next

    With dgTest

        If (ChkboxArray.UBound <> .VisibleRows) Then
            For i = ChkboxArray.UBound + 1 To .VisibleRows - 1
                Load ChkboxArray(i)
                ChkboxArray(i).Width = 190
                ChkboxArray(i).Height = 190
            Next
            For i = .VisibleRows To ChkboxArray.UBound
                
            Next
        End If
    
        OffsetX = OffsetX + (.Columns(ColNdx).Width - ChkboxArray(0).Width) / 2
        OffsetY = OffsetY + 10 ''(.RowHeight - ChkboxArray(0).Height) / 2
        
        .Columns(ColNdx).Alignment = dbgCenter
        .Columns(ColNdx).Locked = True
    
        If .LeftCol <= ColNdx Then
            For i = 0 To .VisibleRows - 1
                ChkboxArray(i).Value = Abs(.Columns(ColNdx).CellValue(.RowBookmark(i)))
                ChkboxArray(i).Top = .Top + .RowTop(i) + OffsetY
                ChkboxArray(i).Left = .Left + .Columns(ColNdx).Left + OffsetX
                ChkboxArray(i).Visible = True
                ChkboxArray(i).ZOrder
            Next
        Else
            i = 0
        End If
    
        For i = i To ChkboxArray.UBound
            ChkboxArray(i).Visible = False
        Next
    End With

ExitPoint:
    bInSetCheckboxes = False
    Exit Sub
ErrorExit:
    Resume ExitPoint
End Sub


Private Function CalcContainerOffset(obj As Object, ByRef OffsetX As Long, ByRef OffsetY As Long)
    Do While Not (obj.Container Is obj.Parent)
        Set obj = obj.Container
        If Not (obj Is Nothing) Then
            OffsetX = OffsetX + obj.Left
            OffsetY = OffsetY + obj.Top
            If obj.BorderStyle = 1 Then '' fixed single
                If obj.Appearance = 1 Then '' 3d
                    OffsetX = OffsetX + 30
                    OffsetY = OffsetY + 30
                Else
                    OffsetX = OffsetX + 15
                    OffsetY = OffsetY + 15
                End If
            End If
        End If
        If (TypeOf obj Is Form) Or (TypeOf obj Is MDIForm) Then Exit Do
  Loop
End Function

Private Sub dgTest_Scroll(Cancel As Integer)
    SetCheckboxes 1, cbTest        'Ici 1 représente la 2e colonne du DataGrid
End Sub

Private Sub cbTest_Click(index As Integer)
    Dim fr As Long
    On Error Resume Next
    fr = dgTest.FirstRow
    With adoTemp.Recordset        'Ici j’utilise un ado mais vous pouvez utilize n’importe quel type de recordset ce bout de code ne doit donc pas être recopié tel quel. Ce code met à jour le champs attaché au checkbox avec la bonne valeur, ce champs doit etre de type boolean donc si vous utilisé SQL SERVER vous devez utilisé un colonne de type BIT.
        .Filter = "LineID='" & index + fr & "'"
        .Fields("Include").Value = cbTest(index).Value
        .UpdateBatch
        .Filter = "LineID<>''"
        .Resync
    End With
    dgTest.FirstRow = fr
    'Fin du code que vous devez adapter.
End Sub

Conclusion

En espérant que cette source puisse vous aidez.
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  • db.mdbTélécharger ce fichier [Réservé aux membres club]155 648 octets
  • Form1.frmTélécharger ce fichier [Réservé aux membres club]Voir ce fichier8 432 octets
  • Form1.frxTélécharger ce fichier [Réservé aux membres club]306 octets
  • MSADODC.OCXTélécharger ce fichier [Réservé aux membres club]131 856 octets
  • MSDATGRD.OCXTélécharger ce fichier [Réservé aux membres club]275 216 octets
  • Project1.vbpTélécharger ce fichier [Réservé aux membres club]Voir ce fichier1 093 octets
  • Project1.vbwTélécharger ce fichier [Réservé aux membres club]Voir ce fichier50 octets

Télécharger le zip

04 avril 2008 15:15:24 :
Il manquait un loop
  • signaler à un administrateur
    Commentaire de zen69 le 01/04/2008 16:12:14

    Si votre grille de données ne se remplie pas, veuillez modifié le path de la db access dans le adoTemp.

    J'attends vos commentaires.

  • signaler à un administrateur
    Commentaire de LIBRE_MAX le 01/04/2008 23:23:02

    Bonsoir,
    Apparament ça fonctionne.
    Il fallait juste ajouter un Loop dans
    Do While Not (obj.Container Is obj.Parent)
            Set obj = obj.Container
            If Not (obj Is Nothing) Then
                OffsetX = OffsetX + obj.Left
                OffsetY = OffsetY + obj.Top
                If obj.BorderStyle = 1 Then '' fixed single
                    If obj.Appearance = 1 Then '' 3d
                        OffsetX = OffsetX + 30
                        OffsetY = OffsetY + 30
                    Else
                        OffsetX = OffsetX + 15
                        OffsetY = OffsetY + 15
                    End If
                End If
            End If
            If (TypeOf obj Is Form) Or (TypeOf obj Is MDIForm) Then Exit Do
      
         lOOP '>>ICI

    End Function

    Ensuite , je ne sais pas à quoi sert
      For i = ChkboxArray.UBound + 1 To .VisibleRows - 1
        Load ChkboxArray(i)
        ChkboxArray(i).Width = 190
        ChkboxArray(i).Height = 190
      Next
      For i = .VisibleRows To ChkboxArray.UBound
        '???  
      Next

    'Sûrement un oubli.Mais un oubli de quoi ?

    Ensuite , le RowHeight n' est pas pris en compte.
    J' ai redimentionné la hauteur des lignes, le CheckBox reste suspendu en haut.

    Mais dans l' ensemble, c' est bien.
    Je ne met pas de note pour l' instant.

    A+



  • signaler à un administrateur
    Commentaire de LIBRE_MAX le 01/04/2008 23:28:26

    Ah ! une dernière chose.
    Si je change la propriété Apparence du CheckBox en Flat,
    celui-ci n' apparait pas dans toutes les lignes.A la place j' ai soit 0 soit -1 selon la valeur du champ.

  • signaler à un administrateur
    Commentaire de zen69 le 03/04/2008 20:09:11

    pour le loop ... c'est mon erreur désolé... pour ce qui est du flat je ne te suis pas mais bon j'apporterai au moins la correction du loop manquant...

  • signaler à un administrateur
    Commentaire de zen69 le 03/04/2008 20:13:34

    Ensuite , je ne sais pas à quoi sert
      For i = ChkboxArray.UBound + 1 To .VisibleRows - 1
        Load ChkboxArray(i)
        ChkboxArray(i).Width = 190
        ChkboxArray(i).Height = 190
      Next
      For i = .VisibleRows To ChkboxArray.UBound
        '???  
      Next

    Ce bout de code sert à capter la premiere ligne visible en haut de datagrid dans le cas ou le curseur du scroll n'est pas a la premiere... si tu enleve ce code tu risque de mettre a jour la mauvaise ligne en cochant/décochant le checkbox, cepandant en effet j'avais commencer un bout de code que je n'ai pas terminé. Je l'enleverai quand je vais apporté la correction de mon dernier commentaire.

  • signaler à un administrateur
    Commentaire de zen69 le 04/04/2008 15:18:02

    Pour ce qui est de ton apparance flat... chez moi ca marche #1 ... je comprends pas...

  • signaler à un administrateur
    Commentaire de LIBRE_MAX le 04/04/2008 16:30:32

    Bonjour,
    Pour l' apparence Flat, effectivement ça marche mais j' ai du rééxécuter le programme pour que le changement prend effet.
    A la première, ça me donne parfois (et pour quelques uns seulement) -1 ou 0 à la place du CheckBox.

    Pour le bout de code en plus, je l' ai supprimé.
    'x For i = .VisibleRows To ChkboxArray.UBound
    'x   '???  
    'x Next

    Quand est-il alors du centrage du CheckBox quand la hauteur de la ligne est redimentionnée ?

    A+

  • signaler à un administrateur
    Commentaire de Chrysostome le 13/04/2008 12:44:38

    Salut!
    Juste une question:
    Ça sert à quoi, si on n'arrive pas à mettre à jour la base?

  • signaler à un administrateur
    Commentaire de LIBRE_MAX le 14/04/2008 01:13:17

    Salut Chrysostome,
    Si si, la table est mise à jour grace à :
    Private Sub cbTest_Click(index As Integer)
        Dim fr As Long
        On Error Resume Next
        fr = dgTest.FirstRow
        With adoTemp.Recordset      
            .Filter = "LineID='" & index + fr & "'"
            .Fields("Include").Value = cbTest(index).Value
            .UpdateBatch
            .Filter = "LineID<>''"
            .Resync
        End With
        dgTest.FirstRow = fr
        'Fin du code que vous devez adapter.
    End Sub

    @Zen69
    Pour le centrage j' ai réactivé le reste de la ligne que tu as mis en commentaire(je ne sais pas pourquoi , dailleur)
    OffsetY = OffsetY + (.RowHeight - ChkboxArray(0).Height) / 2

    et ça marche !

  • signaler à un administrateur
    Commentaire de zen69 le 17/04/2008 15:37:20

    j'avais mis cette ligne en commentaire parce que je ne modifie pas la hauteur de mes lignes donc mes trucs etaient deja centrer...

Ajouter un commentaire

Appels d'offres

Pub



CalendriCode

Mai 2008
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS