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é: 7 691 / 997

Note :
Aucune note

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

Description

Cliquez pour voir la capture en taille normale
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.
 

Fichier Zip

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

Historique

04 avril 2008 15:15:24 :
Il manquait un loop

Commentaires et avis

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

Discussions en rapport avec ce code source dans le forum

VBA: utilisation de MSFlexGrid ou Datagrid avec checkbox [ par -=[ArsoN]=- ] Je travaille présentement à un système de paye en vba et je voudrais savoir quelle type de grille est le plus facile à utiliserÉgalement, je cherche c datagrid ADO..aidez moi!!! [ par neuil ] salut a tous,j'ai un souci...je n'arrive pas à afficher le resultat d'une requete SQL dans ma datagrid sans passer par la pose d'un controle ADO!!il m pbs de saisie avec datagrid liee a un controle ado [ par med ] Bonjour,J'essaye de saisir des donnees sur un grille qui represente le detail d'une forme maitre/detail,le maitre et le detail sont relies a un meme c Case à cocher dans un DataGrid ADO [ par inertia ] Bonjour à tous,J'utilise un contrôle datagrid (ADO) lié à un contrôle Data (ADO) pour visualiser les données d'une base de données ORACLE.Certains cha checkbox dans datagrid [ par yomm ] j'ai un variable boolean et je cherche comment afficher un checkbox dans un datagrid afin de respecter la formatage de Access checkbox et datagrid [ par jeanyves ] A partir d'une base access qui contient un champ "case à cocher" je voudrais obtenir le même résultat lorsque je consulte cette base en vb et dans un CheckBox + datagrid avec Sql Server [ par zenori ] Bonjour,J'alimente un datagrid avec un adodc via une procédure stockée sous SQL Server.J'ai une colonne que je voudrais afficher avec une check box, e requete Ado et Datagrid [ par eldjoule ] El djouleBonjour, Voilà, je fais une requete sur un combo, et des que je selectionne un critère, je veux le résultat dans un datagrid !voici la requet ado sans control et datagrid [ par besy ] voila je suis debutant;)je voudrais afficher ds une datagrid le resultat d'une requete sql sur une base access mais sans controleur ado.donc voila la Mettre des checkbox ou des combobox dans une datagrid [ par S16 ] Bonjour,Comment fait-on pour afficher des checkbox ou des combobox dans une datagrid ?Pour l'instant, j'ai "0" ou "-1" à la place des checkbox.Merci d


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

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

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,562 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.