Bonjour,
Je suis tout nouveau sur ce forum, et tout nouveau à VB.NET également. J'espère qu'une âme charitable voudra bien m'éclairer.

Sur une forme, j'ai un DataGridView qui me donne un sommaire de tous les registres d'une table. Lorsque je clique sur une ligne dans le datagridview (SelectionChanged), je charge alors les donnée du registre dans les champs correspondants en dessous du datagridview pour les éditer. Lorsque je sauvegarde ces données dans la base de donnée, certains champs affichés par le datagridview ne sont plus valides. Je veux donc recharger mes données dans le DataGridView.

Le bug que j'ai actuellement, c'est que lorsque je recharge mes données dans le DataGridView, alors que celui-ci semble vide, il émet un SelectionChanged qui bloque car je tente de charger les données d'une ligne avec un index négatif...

Devrais-je utiliser un autre event que SelectionChanged? Sinon, y aurait-il un autre moyen de recharger mon DataGridView?
Je suis ouvert à toutes vos lumières!!!

(Bon, il me reste des tentatives commentées de déboguages dans mon code , et je dois ajouter que j'utilise MySQL sur un serveur distant...)

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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
Imports MySql.Data.MySqlClient
 
Public Class FormGestMbr
    Public dbconn As New MySqlConnection
    Public sql As String
    Public dbcomm As MySqlCommand
    Public dbread As MySqlDataReader
 
    'create data adapter
    Dim da As Common.DbDataAdapter
    'create dataset
    Dim ds As DataSet = New DataSet
 
    '**************************
    Private bindingSource1 As New BindingSource()
    Private dataAdapter As New MySqlDataAdapter()
 
    Private Sub UpdateDataGridView()
        sql = "SELECT mbr_id, titre, prenom, nomfam, ville, telephone, courriel FROM membres;"
 
        Try
            Me.dataAdapter = New MySqlDataAdapter(sql, dbconn)
 
            Dim commandBuilder As New MySqlCommandBuilder(Me.dataAdapter)
            Dim dss As New DataSet()
            Me.dataAdapter.Fill(dss, "membres")
            Me.bindingSource1.DataSource = dss
            'DataGVMembres.DataSource = dss
            DataGVMembres.DataMember = "membres"
            Me.DataGVMembres.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader)
            'DataGVMembres.AutoResizeColumn(0)
            'DataGVMembres.AutoResizeColumn(1)
            'DataGVMembres.AutoResizeColumn(2)
            'DataGVMembres.AutoResizeColumn(3)
            ''DataGVMembres.AutoResizeColumn(4)
            ''DataGVMembres.AutoResizeColumn(5)
            'DataGVMembres.AutoResizeColumn(6)
        Catch ex As MySqlException
            MessageBox.Show("Erreur: " + sql)
        End Try
 
    End Sub
 
    Private Sub FormGestMbrShown(sender As Object, e As EventArgs) Handles MyBase.Shown
 
        UpdateDataGridView()
 
    End Sub
 
    Private Sub FormGestMbrLoad(sender As Object, e As EventArgs) Handles MyBase.Load
        dbconn = New MySqlConnection("server=localhost;user id=un_user_id;password=un_password;database=une_bd")
        Try
            dbconn.Open()
        Catch ex As Exception
            Console.Out.WriteLine("Erreur de connection à la BD: " + ex.Message)
        End Try
        Me.DataGVMembres.DataSource = Me.bindingSource1
    End Sub
 
    Private Sub FormGestMbrFormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
        'Fermeture de la connection à la BD
        dbconn.Close()
        dbconn.Dispose()
    End Sub
 
    Private Sub DataGVMembres_Click(sender As Object, e As EventArgs) Handles DataGVMembres.Click
 
    End Sub
 
    Private Sub DataGVMembres_SelectionChanged(sender As Object, e As EventArgs) Handles DataGVMembres.SelectionChanged
        'MsgBox(DataGVMembres.SelectedCells.Item(0).Value.ToString())
        '****************************************************
 
        If DataGVMembres.CurrentRow.Index >= 0 Then
            Dim un_mbr_id As String = DataGVMembres.SelectedRows.Item(0).Cells.Item(0).Value.ToString()
            Dim sqlquery As String = "SELECT * FROM membres WHERE mbr_id='" + un_mbr_id + "';"
            Dim data As MySqlDataReader
            Dim adapter As New MySqlDataAdapter
            Dim command As New MySqlCommand(sqlquery, dbconn)
            adapter.SelectCommand = command
            data = command.ExecuteReader()
            data.Read()
            tb_mbr_id.Text = data(0).ToString()
            tbTitre.Text = data(3).ToString()
            tbPrenom.Text = data(2).ToString()
            tbNom.Text = data(1).ToString()
            tbAdresse.Text = data(5).ToString()
            tbVille.Text = data(6).ToString()
            tbCodePostal.Text = data(9).ToString()
            tbProvince.Text = data(7).ToString()
            tbPays.Text = data(8).ToString()
            tbTelephone.Text = data(10).ToString()
            tbFax.Text = data(11).ToString()
            tbCourriel.Text = data(12).ToString()
            cbListeCourriel.Checked = data(15)
            tbInfoComp.Text = data(4).ToString()
            tbVieuxRegistre.Text = data(13).ToString()
            tbDateInscription.Text = data(18).ToString()
            cbNonMembre.Checked = data(14)
            cbProtocoleSigne.Checked = data(17)
            cbCoordonneePerimee.Checked = data(16)
            tbCommMembre.Text = data(19).ToString()
            tbCommAdmin.Text = data(20).ToString()
 
            'MsgBox(data(1).ToString() + " : " + data(2).ToString())
            'While data.Read()
            '    Label1.Text = data(1).ToString
            '    Label2.Text = data(3).ToString
            'End While
 
            data.Close()
            'adapter.Dispose()
            'command.Dispose()
        End If
    End Sub
 
    Private Sub bSauvegarder_Click(sender As Object, e As EventArgs) Handles bSauvegarder.Click
        Dim sqlUpdate As New String("UPDATE membres SET titre='" + tbTitre.Text + "', prenom='" + tbPrenom.Text + "', nomfam='" + tbNom.Text + "', infocomp='" + tbInfoComp.Text + "', adresse='" + tbAdresse.Text + "', ville='" + tbVille.Text + "', province='" + tbProvince.Text + "', pays='" + tbPays.Text + "', code_postal='" + tbCodePostal.Text + "', telephone='" + tbTelephone.Text + "', fax='" + tbFax.Text + "', courriel='" + tbCourriel.Text + "', vieuxreg='" + tbVieuxRegistre.Text + "', non_membre=" + cbNonMembre.Checked.ToString + ", liste_courriel=" + cbListeCourriel.Checked.ToString + ", cdonnee_perimee=" + cbCoordonneePerimee.Checked.ToString + ", protocole_signe=" + cbProtocoleSigne.Checked.ToString + ", date_inscription='" + tbDateInscription.Text + "', commentaire_mbr='" + tbCommMembre.Text + "', commentaire_admin='" + tbCommAdmin.Text + "' WHERE mbr_id='" + tb_mbr_id.Text + "';")
 
        Dim cmd As MySqlCommand = New MySqlCommand(sqlUpdate, dbconn)
        Dim i As Integer = cmd.ExecuteNonQuery()
        If (i > 0) Then
            MsgBox("Sauvegarde des modifications au registre du membre " + tbPrenom.Text + " " + tbNom.Text + " correctement effectuée!")
            UpdateDataGridView()
        Else
            MsgBox("Erreur de sauvegarde des modifications au registre du membre " + tbPrenom.Text + " " + tbNom.Text + "...")
        End If
        'UpdateDataGridView()
 
    End Sub
End Class