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

Contribuez .NET Discussion :

Remplir dynamiquement un DataGridView avec une checkbox sous VBE 2008


Sujet :

Contribuez .NET

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 125
    Par défaut Remplir dynamiquement un DataGridView avec une checkbox sous VBE 2008
    Salut à tous

    Ce n'est pas une question mais une solution possible que je propose ici.
    En effet je programme sous Visual Basic 2008 Express et j'ai recherché un peu partout comment remplir un DataGridView dynamiquement (comprendre avec le résultat d'une requête) quand on ajoute à celui-ci une CheckBox. Autant dire que les solutions ne sont pas légion.
    Donc je participe comme je peux à la grande matrice

    Je considère évidement que votre projet et votre form sont déjà créés, sinon le site à de très bon tuto dessus !

    Il faut avant toute chose créer son dataGridView en mode Design, remplir tous les paramètres souhaités dans les Propriétés.
    Vient ensuite le moment ou il faut créer la colonne checkBox. Pour cela, il faut aller dans la propriété Columns de votre DataGridView, Ajouter une colonne de type "DataGridViewCheckboxColumn", puis remplir tous les paramètres pour votre colonne (pensez à mettre la propriété "Width" et "MinimumWidth" à 30 sinon la checkBox ne s'affichera pas car la colonne ne sera pas assez large.

    Une fois cela fait, passons à la partie code :
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    'Create query
    MyQuery = "select nom_de_ma_colonne_1, nom_de_ma_colonne_2 FROM ma_table WHERE ma_condition;"
    
    'Create Connection
    MyConnection = New MySqlConnection("Server=localhost; Database=ma_base; User ID=root; Password=; Connect Timeout = 120")
    
    'Open connection
    MyConnection.Open()
    
    'Execute query
    MyCommand = New MySqlCommand(MyQuery, MyConnection)
    MyDataReader = MyCommand.ExecuteReader
    
    'Number of colums in the DataGridView witch is the number of field + one for the CheckBox
    MyDataGridView.ColumnCount = (MyDataReader.FieldCount + 1)
    
    'DataGridView style
    With MyDataGridView.ColumnHeadersDefaultCellStyle
        .BackColor = Color.Navy
        .ForeColor = Color.White
        .Font = New Font(MyDataGridView.Font, FontStyle.Bold)
    End With
    
    'Define columns
    With MyDataGridView
         'Columns(0) is the column with the checkbox, it's define in the [Desing] windows (collection) 
         'Define Column 1
         .Columns(1).Name = "nom_de_ma_colonne_1"
         .Columns(1).HeaderText = "nom_de_l_entete_de_ma_colonne_1"  'Can be different from the name
         'Define Column 2
         .Columns(2).Name = "nom_de_ma_colonne_2"
         .Columns(2).HeaderText = "nom_de_l_entete_de_ma_colonne_2"  'Can be different from the name
    End With
    
    'Declare the line and the differents cels
    Dim line As DataGridViewRow
    Dim celCkdBox As New DataGridViewCheckBoxCell     'Cell for the CheckBox
    Dim celData As New DataGridViewTextBoxCell      'Cell for data
    
    'Reading records
    While MyDataReader.Read
    
        'Initialize the line and the cell for the CheckBox
        line = New DataGridViewRow
        celCkdBox = New DataGridViewCheckBoxCell
    
        'Give value to cell of the CheckBox
        celCkdBox.Value = False     'Means that CheckBox is not Checked
    
         'Add the cell to the line
         line.Cells.Add(celCkdBox)
    
         'Reading records in MyDataReader 
         For i As Integer = 0 To MyDataReader.FieldCount - 1
    
              'Initialize the cell for data
              celData = New DataGridViewTextBoxCell
    
              'Test to know if data are NULL or empty, test MUST be on the value 
              If Not MyDataReader.GetValue(i) Is Nothing AndAlso Not (MyDataReader.GetValue(i) Is DBNull.Value) Then
                   'Give value to cell of data
                   celData.Value = MyDataReader.GetString(i)
               End If
    
               'Add the cell with data to the line
               line.Cells.Add(celData)
          Next i
    
         'Add the line in the DataGridView
         MyDataGridView.Rows.Add(line)
    
    End While
    'End of Records
    
    'Close reader
    MyDataReader.Close()
    
    'Close connection
    MyConnection.Close()
    Comme je l'ai dis, c'est UNE solution pour remplir dynamiquement un DataGridView avec une CheckBox, il en existe très certainement d'autre ! Donc pour les futurs "mais c'est pas comme ça" ou autre passez votre chemin, d'avance merci !

    Pour ceux que le script intéresse, n'hésitez pas à l'améliorer et à nous faire part de vos améliorations. Ou à poser des questions qui permettrai de l'améliorer.

    @++

  2. #2
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Par défaut
    j'ai rien compris.
    pourquoi ne fais-tu pas un databind direct? avec le bon type de données retourné par ta requête SQL, ca cochera tout seul (ou non) la checkbox de chaque ligne, et pas besoin de boucler sur le résultat :/

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 16
    Par défaut
    Citation Envoyé par Louis-Guillaume Morand Voir le message
    j'ai rien compris.
    pourquoi ne fais-tu pas un databind direct? avec le bon type de données retourné par ta requête SQL, ca cochera tout seul (ou non) la checkbox de chaque ligne, et pas besoin de boucler sur le résultat :/
    Bonjour

    C'est moi qui ai posté le code précédent (je n'avais pas fait attention au log de mon collègue), bref...
    Le souci c'est que je n'ai pas de résultats boolean de ma BdD, elles sont montées dynamiquement lorsque je construis mon DataGridView.

    Mais si tu penses que c'est faisable, je veux bien un coup de main pour simplifier le code.

  4. #4
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Par défaut
    Le souci c'est que je n'ai pas de résultats boolean de ma BdD, elles sont montées dynamiquement lorsque je construis mon DataGridView.
    tu pourrais éclaircir?
    j'ai regardé ton code (beurk le VB ) et je ne vois pas où tu définis ton booléen ni ne coche la case. tu mets false tout le temps donc je comprend pas.

    Ensuite, ce n'est pas parce qu'une table ne contient pas de booléen (bit) que tu ne peux pas récupérer un booléen.

    il se peut que tu aies un cas très particulier pour calculer ton "statut" booléen mais s'il utilise des données en base d'une façon ou d'une autre alors oui, on peut simplifier le code comme ci:
    (c'est du C#, dsl)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    wdgLists.DataSource = _recipientMgr.SelectAll();
    wdgLists.DataBind();
    Moi je préfère toujours partir du principe qu'il faut découpler données et affichage. tu donnes des données à un composant, et lui l'affiche direct. Sans bidouille pour adapter, cela permet par la suite de changer le composant, sans rien changer d'autre.


    il faudrait que j'en sache plus sur ton contexte pour savoir si tu peux simplifier ou non

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 16
    Par défaut
    Salut
    Le projet est en VB donc pas le choix...

    Pour mes CheckedBox, lorsque je la charge dans ma DataGridView, elle est systématiquement à false car non cochée de base. Donc oui je la charge toujours à false
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    celCkdBox.Value = False
    Sinon pour le contexte, il faut juste que je récupère toutes les données (nom, prénom, adresse, etc.) des personnes portant le nom saisit par l'utilisateur. Les CheckBox servent à sélectionner une ou plusieurs personnes et faire ensuite une recherche complémentaire sur les dites personnes.

  6. #6
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Par défaut
    okiiiiiiiiiiiiiiiii

    je pensais que tu voulais charger des données dynamiquement et afficher certains résultats sous forme de checkbox.

    ca reste que selon moi tu te prends la tête pour pas grand chose, je trouve ca meme sale comme solution.
    Moi je ferais comme ceci

    1- tu rajoutes une colonne template avec une checkbox marquée comme non cochée (d'ailleurs, ca m'étonne que t'aies besoin de mettre à false pour que ca ne soit pas coché)

    2- tu bindes tes données directement. pas la peine de passer par la création d'une nouvelle ligne à chaque fois, surtout pour gérer les valeurs des cellules une par une.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 16
    Par défaut
    Je ne connaissais pas le système de DataBind, je vais regarder ça.
    ça semble en effet plus rapide.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 16
    Par défaut
    ça fonctionne très bien et en effet c'est beaucoup plus simple et rapide à gérer !!!
    Merci pour le tuyau Louis-Guillaume

    donc au final le code ça donne ça
    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
    'Create query
    MyQuery = "select nom_de_ma_colonne_1, nom_de_ma_colonne_2 FROM ma_table WHERE ma_condition;"
    
    'Create Connection
    MyConnection = New MySqlConnection("Server=localhost; Database=ma_base; User ID=root; Password=; Connect Timeout = 120")
    
    'Open connection
    MyConnection.Open()
    
    'Execute query
    MyCommand = New MySqlCommand(MyQuery, MyConnection)
    MyDataAdapter = New MySqlDataAdapter(MyCommand)
    
    'Init MyCommand
    MyCommand.Connection() = MyConnection
    
    'Load the DataSet with the Fill Property
    MyDataAdapter.Fill(MyDataSet, "nom_de_votre_futur_DataTable")
    
    'Add the DataTable in MyDataTable
    MyDataTable = MyDataSet.Tables("nom_de_votre_futur_DataTable")
    
    'Add a column for the checkedBox
    MyDataGridView.Columns.Add(New DataGridViewCheckBoxColumn)
    
    'Load MyDataTable in MyDataGridView (the source to load in your DataGridView)
    MyDataGridView.DataSource = MyDataTable
    
    'Define columns
    With Interface_TEMIS.dgvSelEntRchch
         'Columns(0) for CheckedBox
         .Columns(0).Name = "cbColumn"
         .Columns(0).Visible = True
         .Columns(0).MinimumWidth = 25
         'Column with the ID, no need for the user to see this column
         .Columns(1).Name = "ID"
         .Columns(1).Visible = False
         'Column with the name
         .Columns(2).Name = "Name"
         .Columns(2).HeaderText = "Nom Complet"
         .Columns(2).Visible = True
    End With
    
    'Close Connection
    MyConnection.Close()
    De plus les possibilités d'arrangement sont bien supérieure comme ça !!!

  9. #9
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Par défaut
    c'est surtout ULTRA puissant, puisqu'avec le temps, t'apprendras à travailler avec le tout objet (utilisation des ORM), et que tu peux binder des données, sur tout type de contrôle (listbox, listview, datagrid) et tu peux avec des custom controls, rendre des formulaire entièrement bindables. form.source= monobjet et tous les champs se remplissent.

    l'autre avantage c'est, lorsque tes sources de données sont "propres", de pouvoir utiliser une grille (par exemple) avec plusieurs sources.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grid.DataSource = new List<User>();
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grid.DataSource = new List<Animal>();
    et si tu laisses la génération des colonnes automatiques, tu peux gérer un seul formulaire et plein de données différentes. (un peu comme fait ASP.Net Dynamic Data)


    ps: il marche ton code précédent?
    il manque pas un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyDataGridView.DataBind();
    ?

    conseil bonus: penses à utiliser le mot clé "using" pour tes objets de connection (c'est PAS le même que pour les namespaces!!) pour améliorer le disposing automatique

    conseil bonus2: ne met JAMAIS tes requêtes en dur dans ton code. procédure stockée ou alors ORM et requêtes auto générées

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 11/03/2010, 13h26
  2. Remplir une cellule Excel avec une condition sous vb
    Par enibris dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 14/01/2008, 14h47

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