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.NET Discussion :

Création dynamique de checkbox et picturebox à partir d'une base de données


Sujet :

VB.NET

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2016
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Création dynamique de checkbox et picturebox à partir d'une base de données
    Bonjour,

    Je fais l'un de mes premiers programmes après avoir suivi quelques cours de VB.NET en ligne et voici ce que je souhaiterais faire.
    J'ai relié mon programme VB.NET à une base de données Access (qui est bien affichée dans ma fenêtre "Source de données"). Cette base de données comporte deux tables, "Games" et "Kicks".

    Sur mon interface graphique Form1, j'ai une grande picturebox affichant un fond de terrain de foot, sur laquelle j'aimerais faire figurer une image pour chaque tir depuis la position où la balle a été frappée. Chaque enregistrement de la base de données correspond à un tir et contient les informations sur l'abscisse (abs) et l'ordonnée (ord) de la position de frappe. J'ai donc créé une boucle pour chaque enregistrement qui me permet d'afficher une nouvelle picturebox à la position souhaitée avec une image de balle verte ou rouge (si le tir est cadré ou pas). Je n'ai aucun message d'erreur mais rien ne s'affiche dans mon programme à part mon fond de terrain et quelques premières checkbox que j'avais mises pour pouvoir trier les tirs (le seul message est une alerte "Une exception de première chance de type System.Data.OleDb.OleDbException s'est produite dans System.Data.dll", mais le programme peut s'exécuter).

    De plus, j'aimerais aussi créer des checkbox dynamiques pour chaque enregistrement de match (table "Games", comprenant notamment les champs "Team" et "Location"), permettant de cocher ou non les matchs, mais là encore malgré mes recherches sur internet mon code n'affiche pas d'erreur (mais la même alerte) et rien ne s'affiche...

    Si vous pouviez m'aider ce serait super !! Je vous mets mon 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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    Imports System
    Imports System.Data
    Imports System.Data.OleDb
    Imports Microsoft.VisualBasic
     
    Public Class Form1
        Public connection As OleDbConnection 'Connexion
        Public command As OleDbCommand 'Commande
        Public dataReader As OleDbDataReader 'Data reader (simple)
        Public dataAdapter As OleDbDataAdapter 'Data adapter (multiple)
        Public dataSet As New DataSet 'Data set
        Public SQL As String 'Requête
        Public dataTable As DataTable 'Data table
        Public dataRow As DataRow 'Ligne
        Public rowNumber As Integer 'Enregistrement
        Public connectionString As String 'String de connexion
        Public commandBuilder As OleDbCommandBuilder 'Command builder
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            'Ouverture de connexion
            connectionString = "provider = microsoft.ace.oledb.12.0 ; datasource = " & Application.StartupPath & "\DB_Kicks.accdb; Persist Security Info = false; Initial Catalog = Test"
            connection = New System.Data.OleDb.OleDbConnection
            connection.ConnectionString = connectionString
            connection.Open()
     
            'Création de requête SQL
            SQL = "SELECT * FROM Games"
     
            'Création de commande
            command = New OleDbCommand(SQL, connection)
     
            'Création du data reader (lecture champs simples)
            dataReader = command.ExecuteReader()
     
            'Création du data adapter (lecture de plusieurs champs)
            dataAdapter = New OleDbDataAdapter(command)
     
            'Instance de commande avec la connexion
            command.Connection = (connection)
     
            'Chargement du data set
            dataAdapter.Fill(dataSet, "Games")
     
            'Chargement de la data table
            dataTable = dataSet.Tables("Games")
     
            'Assignation de la valeur de lignes
            rowNumber = dataTable.Rows.Count
     
            'Création de CheckBox pour chaque enregistrement de match
            Dim i As Integer = 0
            For i = 0 To rowNumber - 1
                Dim BOXG As New CheckBox
                With BOXG
                    .Name = "BOX_Game" & i + 1
                    .Text = dataTable.Rows(i).Item("Team" & " (" & "Location" & ")")
                    .Font = New System.Drawing.Font("Microsoft Sans Serif", 11)
                    .Location = New System.Drawing.Point(592, 37 + 28 * i)
                End With
            Next
            i = 0
     
            'Modification de la requête pour passer à la table des coups de pieds
            SQL = "SELECT * FROM Kicks"
            command = New OleDbCommand(SQL, connection)
            dataReader = command.ExecuteReader()
            dataAdapter = New OleDbDataAdapter(command)
            command.Connection = (connection)
            dataAdapter.Fill(dataSet, "Games")
            dataTable = dataSet.Tables("Games")
            rowNumber = dataTable.Rows.Count
     
            'Création de PictureBox pour chaque coup de pied
            For i = 0 To rowNumber - 1
                Dim KickPBOX As New PictureBox
                With KickPBOX
                    .Name = "Kick " & i + 1
                    .Location = New System.Drawing.Point(dataTable.Rows(i).Item("abs"), dataTable.Rows(i).Item("ord"))
                    Dim converted As Boolean = dataTable.Rows(i).Item("Converted")
                    If converted = True Then
                        .BackgroundImage = Image.FromFile(Application.StartupPath & "greenball.png")
                        .BackgroundImageLayout = ImageLayout.Zoom
                    Else : .BackgroundImage = Image.FromFile(Application.StartupPath & "redball.png")
                        .BackgroundImageLayout = ImageLayout.Zoom
                    End If
                End With
            Next
     
     
        End Sub
     
        Private Sub BOX_All_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BOX_All.CheckedChanged
     
            BOX_Converted.Checked = BOX_All.Checked
            BOX_Missed.Checked = BOX_All.Checked
            BOX_Centered.Checked = BOX_All.Checked
            BOX_Offset.Checked = BOX_All.Checked
     
        End Sub
    End Class
    (PS : Petit détail : j'ai réassigné de nouvelles valeurs pour toutes les variables concernant la requête SQL alors que mes tables sont liées (la clef primaire de "Games" apparaît dans "Kicks" mais je ne sais pas comment chercher les champs de "Games" directement depuis "Kicks", il y a certainement un moyen plus rapide).

    Merci beaucoup de m'avoir lu jusqu'au bout !!

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    2 choses :
    - il ne faut pas mettre de code dans le form load ou alors englobé par un try catch
    il y a un bug de .net qui fait que les erreurs qui se produisent dans form_load ne sont pas prises en comptes
    donc soit mettre un try catch et un point d'arret dans le catch, soit mettre ton code dans un public sub new (le sub new est appelé avant le form_load, c'est le constructeur de la classe)
    au passage les try catch c'est bien d'en mettre partout, avec quelque chose dans le catch pour être averti
    - c'est bien beau de créer des chk et pct, mais vs ne va deviner où tu les veux (en effet tu peux avoir plusieurs fenetres ouvertes à un instant T), il faut donc ajouter lenomduparent.controls.add(le controle créé)

    quand tu as des données liées entre plusieurs tables il faut des jointures pour faire la liaison
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from enfant inner join parent on parent.id = enfant.idparent -- => pour chaque enfant tu auras les infos du parent sur la même ligne

    select * est à éviter quand on ne veut pas lire toutes les colonnes, on spécifie alors celles qu'on veut

    autre info, quand on créé des controles à la volée, il est parfois utile de gérer des évènements sur ceux ci, pour ca il faut écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AddHandler ControleCréé.NomEvent, AddressOf TelleSub
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2016
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Merci !
    Merci beaucoup !

    Je teste ça et je dis si j'ai un nouveau problème Merci de ta réactivité en tout cas !!

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2016
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Message d'erreur
    Bonjour,

    Après modification selon tes conseils (j'ai rajouté les try catch et les Me.Control.Adds() ), j'ai un message d'erreur à rallonge, qui commence par :
    "System.Data.OleDb.OleDbException (0x80040E21) : Une opération OLE-DB en plusieurs étapes a généré des erreurs. Vérifiez chaque valeur d'état OLE-DB disponible. Aucun travail n'a été effectué.
    La suite des erreurs est probablement dû à l'absence de connexion avec la base de données du coup.

    Je remets mon code pour comparaison :
    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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    Imports System
    Imports System.Data
    Imports System.Data.OleDb
    Imports Microsoft.VisualBasic
     
    Public Class Form1
        Public connection As OleDbConnection 'Connexion
        Public command As OleDbCommand 'Commande
        Public dataReader As OleDbDataReader 'Data reader (simple)
        Public dataAdapter As OleDbDataAdapter 'Data adapter (multiple)
        Public dataSet As New DataSet 'Data set
        Public SQL As String 'Requête
        Public dataTable As DataTable 'Data table
        Public dataRow As DataRow 'Ligne
        Public rowNumber As Integer 'Enregistrement
        Public connectionString As String 'String de connexion
        Public commandBuilder As OleDbCommandBuilder 'Command builder
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
            Try
                'Ouverture de connexion
                connectionString = "provider = microsoft.ace.oledb.12.0 ; datasource = " & Application.StartupPath & "\DB_Kicks.accdb; Initial Catalog = Test"
                connection = New System.Data.OleDb.OleDbConnection
                connection.ConnectionString = connectionString
                connection.Open()
     
                'Création de requête SQL
                SQL = "SELECT Team FROM Games"
     
                'Création de commande
                command = New OleDbCommand(SQL, connection)
     
                'Création du data reader (lecture champs simples)
                dataReader = command.ExecuteReader()
     
                'Création du data adapter (lecture de plusieurs champs)
                dataAdapter = New OleDbDataAdapter(command)
     
                'Instance de commande avec la connexion
                command.Connection = (connection)
     
                'Chargement du data set
                dataAdapter.Fill(dataSet, "Games")
     
                'Chargement de la data table
                dataTable = dataSet.Tables("Games")
     
                'Assignation de la valeur de lignes
                rowNumber = dataTable.Rows.Count
     
            Catch ex As Exception
                MsgBox(ex.ToString)
            End Try
     
     
            Try
                'Création de CheckBox pour chaque enregistrement de match
                Dim i As Integer = 0
                For i = 0 To rowNumber - 1
                    Dim BOXG As New CheckBox
                    With BOXG
                        .Name = "BOX_Game" & i + 1
                        .Text = dataTable.Rows(i).Item("Team" & " (" & "Location" & ")")
                        .Font = New System.Drawing.Font("Microsoft Sans Serif", 11)
                        .Location = New System.Drawing.Point(592, 37 + 28 * i)
                    End With
                    Me.Controls.Add(BOXG)
                Next
                i = 0
            Catch ex As Exception
                MsgBox(ex.ToString)
            End Try
     
            Try
                'Modification de la requête pour passer à la table des coups de pieds
                SQL = "SELECT * FROM Kicks INNER JOIN Games ON Games.GameID = Kicks.GameID"
                command = New OleDbCommand(SQL, connection)
                dataReader = command.ExecuteReader()
                dataAdapter = New OleDbDataAdapter(command)
                command.Connection = (connection)
                dataAdapter.Fill(dataSet, "Kicks")
                dataTable = dataSet.Tables("Kicks")
                rowNumber = dataTable.Rows.Count
     
                'Création de PictureBox pour chaque coup de pied
                For i = 0 To rowNumber - 1
                    Dim KickPBOX As New PictureBox
                    With KickPBOX
                        .Name = "Kick " & i + 1
                        .Location = New System.Drawing.Point(dataTable.Rows(i).Item("abs"), dataTable.Rows(i).Item("ord"))
                        Dim converted As Boolean = dataTable.Rows(i).Item("Converted")
                        If converted = True Then
                            .BackgroundImage = Image.FromFile(Application.StartupPath & "greenball.png")
                            .BackgroundImageLayout = ImageLayout.Zoom
                        Else : .BackgroundImage = Image.FromFile(Application.StartupPath & "redball.png")
                            .BackgroundImageLayout = ImageLayout.Zoom
                        End If
                    End With
                    Me.Controls.Add(KickPBOX)
                Next
            Catch ex As Exception
                MsgBox(ex.ToString)
            End Try
     
        End Sub
     
        Private Sub BOX_All_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BOX_All.CheckedChanged
     
            BOX_Converted.Checked = BOX_All.Checked
            BOX_Missed.Checked = BOX_All.Checked
            BOX_Centered.Checked = BOX_All.Checked
            BOX_Offset.Checked = BOX_All.Checked
     
        End Sub
    End Class
    Après de nouvelles recherches sur internet, les seules réponses que j'ai pu obtenir évoquent une désactivation du pare-feu. Je me demande si c'est bien la solution ou si une désactivation partielle conviendrait mieux (et si oui comment faire).

    Merci encore !

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    avec le message d'erreur sur google, je ne vois rien qui ait à voir avec le pare feu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dataReader = command.ExecuteReader()
     
    dataAdapter = New OleDbDataAdapter(command)
    je pense plutot que ca vient de là, soit tu fais l'un soit tu fais l'autre mais pas les 2
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2016
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Toujours pas...
    J'ai essayé d'enlever le data reader (dont je ne me sers pas pour le moment) mais ça ne fonctionne toujours pas, le message d'erreur est le même...

  7. #7
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    le topic que tu link parle de sql server, qui est une base réseau, avec le dialogue se fait par tcp/ip
    donc là oui un firewall peut bloquer

    tu utilises access, qui est une base fichier, donc le firewall n'a rien à voir là dedans

    après ca aurait été bien que tu nous donnes la ligne qui passe en erreur
    si c'est sur la connexion, c'est que ta chaine de connexion n'est peut etre pas bonne, si c'est sur l'execution de la requete, c'est la syntaxe qui est à vérifier
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2016
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    C'est justement là le problème : je n'ai pas d'erreur dans la liste d'erreurs, donc pas de ligne concernée...
    Quand je teste ma connexion avec la base de données Access cela semble fonctionner (l'icône du cylindre jaune à côté du nom de la base est surmonté d'une croix rouge quand elle est fermée, et ce cylindre est assorti d'une petite prise grise quand la connexion est ouverte).
    Du coup l'erreur se situerait dans la requête SQL ?...

  9. #9
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    la liste d'erreurs affichée dans visual studio n'indique que les erreurs de compilation = les erreurs qui empêchent ton code d'être transformé en .exe
    une exception qui se déclenché pendant l'exécution arrive dans le catch et sur la variable ex tu as toutes les infos (numéro de ligne etc...)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. Réponses: 5
    Dernier message: 09/02/2014, 14h32
  2. Réponses: 1
    Dernier message: 21/04/2011, 22h38
  3. Réponses: 1
    Dernier message: 29/10/2006, 05h04
  4. [Conception] creation de fiche dynamique a partir d'une base de données
    Par badnane2 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 05/06/2006, 16h50

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