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:
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 !!