none
Bouton pour sauvegarder les enrégistrements d'une table RRS feed

  • Question

  • Bonjour,

    J'ai crée une base de données avec un formulaire contenant un dataGridView. Le double-clic sur une ligne ouvre un formulaire et me charge les données selectionnées dans celui-ci.

    Ma difficulté réside dans le fait que je ne parviennes pas à coder un bouton (SavBtn) sur ce nouveau formulaire qui devrait enrégistrer les modifications des données ainsi chargées dans le nouveau formulaire, et si possible les actualiser le DataGridView initial.

    Voici mon extrait de code

     Private Sub SavBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SavBtn.Click
    
            Me.UtilisateurBindingSource.EndEdit()
    
            Me.TableAdapterManager.UpdateAll(Me.TestDataSet)
    
            Me.Validate()
    
     
    
        End Sub
    
    
    Merci pour votre aide.
    jeudi 4 février 2010 09:11

Réponses

  • Bonjour,

    Pas de problème.

    Voilà une solution avec 2 Forms.
    Le Form1 contient une DataGridView.
    Il appelle le Form2 sur un double click sur une cellule de la grid.
    Le Form2 ne contient qu'une textbox.

    On double clique sur le Form1, cela ouvre le Form2, qui a sa Textbox remplie par le Nom de la ligne de la Grid qui a été cliquée.
    On édite la textbox dans le Form2, on sauve, cela met à jour la grid du Form1.

    Public Partial Class Form1
        Inherits Form
        Private bindingSource1 As BindingSource
        Private dataSet1 As DataSet
        
        Public Sub New()
            InitializeComponent()
            
            dataSet1.Tables.Add("Test")
            dataSet1.Tables("Test").Columns.Add("Id")
            dataSet1.Tables("Test").Columns.Add("Nom")
            
            Dim dataRow1 As DataRow = dataSet1.Tables("Test").NewRow()
            dataRow1("Id") = 1
            dataRow1("Nom") = "Toto"
            dataSet1.Tables("Test").Rows.Add(dataRow1)
            
            Dim dataRow2 As DataRow = dataSet1.Tables("Test").NewRow()
            dataRow2("Id") = 2
            dataRow2("Nom") = "Titi"
            dataSet1.Tables("Test").Rows.Add(dataRow2)
            
            bindingSource1.DataSource = dataSet1.Tables("Test")
            dataGridView1.DataSource = bindingSource1
        End Sub
        
        
        Private Sub dataGridView1_CellDoubleClick(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs)
            ' Ici on lance le 2eme Form
            Dim form As New Form2()
            form.BindingSource = bindingSource1
            form.RefreshTextBox()
            
            ' Après un Show on ne récuperera la main que quand le Form2 sera fermé.
                
                ' Le 2eme Form vient de se fermer, on peut sauver.
                'Me.TableAdapterManager.UpdateAll(Me.dataSet1)
                
            form.Show()
        End Sub
    End Class


    Public Partial Class Form2
        Inherits Form
        
        Public Property BindingSource() As BindingSource
            Get
                Return bindingSource1
            End Get
            Set(ByVal value As BindingSource)
                bindingSource1 = value
            End Set
        End Property
        
        Public Sub New()
            InitializeComponent()
        End Sub
        
        Public Sub RefreshTextBox()
            textBox1.DataBindings.Add("Text", bindingSource1, "Nom")
        End Sub
        
        Private Sub btnSave_Click(ByVal sender As Object, ByVal e As EventArgs)
            bindingSource1.EndEdit()
            Me.Close()
        End Sub
    End Class

    En espérant que cela te permette d'y voir plus clair.

    Cordialement,

    Thomas



    Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr
    • Marqué comme réponse Alex Petrescu mardi 9 février 2010 13:48
    jeudi 4 février 2010 16:22
  • Bonjour NOUBISSI,

    Bon, tant mieux si tu as réussi à faire tourner mon exemple, je l'ai écrit vite fait moi-même comme cela j'étais sûr de mon coup ;)

    Alors, de ce que j'en vois sur ton code, il y a un problème avec l'IDTextBox.
    En effet, lorsque tu fais un Add sur un DataBinding, le premier argument contient la Propriété du Control que tu mets à jour.
    En l'occurence, si c'est une TextBox, ca sera "Text", car cela revient à faire : textBox1.Text = UtilisateurBindingSource.ID
    Ensuite, pour les autre TextBox, je ne pense pas que tu aies besoin de préfixer par Utilisateur, seul le nom de la Propriété doit être pris en compte.

    Cordialement,

    Thomas


    Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr
    • Marqué comme réponse Alex Petrescu mardi 9 février 2010 13:48
    vendredi 5 février 2010 14:24

Toutes les réponses

  • Bonjour,

    Une solution (plusieurs existent) consiste à passer le BindingSource de ta DataGridView en argument de la création de ton nouveau Form.

    Une fois que c'est fait, tu bindes les textbox et autres controls de ton nouveau formulaire à ton BindingSource.
    Lorsque tu feras ton Save, il mettra a jour les donnes dans ta base et dans ton BingdingSource.
    Comme c'est le même BindingSource qui gère à la fois ta grille et ton nouveau formulaire, ta grille se mettra a jour automatiquement.

    Cordialement,

    Thomas
    Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr
    jeudi 4 février 2010 09:42
  • Une fois de plus Bonsoir,


    Désolé pour ma tête dure!!!

    La méthode m'est encore légèrement floue. Après de longues heures de tentatives je n'y parviens pas toujours.

    Pouvez-vous s'il vous plait m'orienter vers une autre methode (au Niveau d'un novice que je suis) ou vers un tuto plus pratique, je comprendrais certainement mieux.

    Merci
    jeudi 4 février 2010 15:38
  • Bonjour,

    Pas de problème.

    Voilà une solution avec 2 Forms.
    Le Form1 contient une DataGridView.
    Il appelle le Form2 sur un double click sur une cellule de la grid.
    Le Form2 ne contient qu'une textbox.

    On double clique sur le Form1, cela ouvre le Form2, qui a sa Textbox remplie par le Nom de la ligne de la Grid qui a été cliquée.
    On édite la textbox dans le Form2, on sauve, cela met à jour la grid du Form1.

    Public Partial Class Form1
        Inherits Form
        Private bindingSource1 As BindingSource
        Private dataSet1 As DataSet
        
        Public Sub New()
            InitializeComponent()
            
            dataSet1.Tables.Add("Test")
            dataSet1.Tables("Test").Columns.Add("Id")
            dataSet1.Tables("Test").Columns.Add("Nom")
            
            Dim dataRow1 As DataRow = dataSet1.Tables("Test").NewRow()
            dataRow1("Id") = 1
            dataRow1("Nom") = "Toto"
            dataSet1.Tables("Test").Rows.Add(dataRow1)
            
            Dim dataRow2 As DataRow = dataSet1.Tables("Test").NewRow()
            dataRow2("Id") = 2
            dataRow2("Nom") = "Titi"
            dataSet1.Tables("Test").Rows.Add(dataRow2)
            
            bindingSource1.DataSource = dataSet1.Tables("Test")
            dataGridView1.DataSource = bindingSource1
        End Sub
        
        
        Private Sub dataGridView1_CellDoubleClick(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs)
            ' Ici on lance le 2eme Form
            Dim form As New Form2()
            form.BindingSource = bindingSource1
            form.RefreshTextBox()
            
            ' Après un Show on ne récuperera la main que quand le Form2 sera fermé.
                
                ' Le 2eme Form vient de se fermer, on peut sauver.
                'Me.TableAdapterManager.UpdateAll(Me.dataSet1)
                
            form.Show()
        End Sub
    End Class


    Public Partial Class Form2
        Inherits Form
        
        Public Property BindingSource() As BindingSource
            Get
                Return bindingSource1
            End Get
            Set(ByVal value As BindingSource)
                bindingSource1 = value
            End Set
        End Property
        
        Public Sub New()
            InitializeComponent()
        End Sub
        
        Public Sub RefreshTextBox()
            textBox1.DataBindings.Add("Text", bindingSource1, "Nom")
        End Sub
        
        Private Sub btnSave_Click(ByVal sender As Object, ByVal e As EventArgs)
            bindingSource1.EndEdit()
            Me.Close()
        End Sub
    End Class

    En espérant que cela te permette d'y voir plus clair.

    Cordialement,

    Thomas



    Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr
    • Marqué comme réponse Alex Petrescu mardi 9 février 2010 13:48
    jeudi 4 février 2010 16:22
  • Merci THOMAS,

    Ta leçon est très bonne.

    Avant de l'appliquer dans mon petit projet, je l'ai testé en intégral et ça MARCHE 10/10.

    Mais au niveau de mon application le double-click sur le DataGirdView génère une erreur sur le 2nd formulaire, au niveau des lignes de chargement des Textbox 
    (L'exception ArgumentNullException n'a pas été gérée)

    [CODE]Public Sub RefreshTexBox()
    'ID de type Int
            IDTextBox.DataBindings.Add("Integer", UtilisateurBindingSource, "ID")
    'Nom de type Varchar(50)
            NomTextBox.DataBindings.Add("Text", UtilisateurBindingSource, "Utilisateur.Nom")
    'Prenom de type Varchar(50)
            PrenomTextBox.DataBindings.Add("Text", UtilisateurBindingSource, "Utilisateur.Prenom")
    'Adresse de type Varchar(50)
            AdresseTextBox.DataBindings.Add("Text", UtilisateurBindingSource, "Utilisateur.Adresse")
    'Commentaires de type Text
            CommentaireTextBox.DataBindings.Add("Text", UtilisateurBindingSource, "Utilisateur.Commentaire")
        End Sub[/CODE]


    Dans cet extrait j'ai du Remplacer Ma bindingSource1 (UtilisateurBindingSource) par ma DataSet pour vérifier si ça pouvait être une cause de l'erreur, mais RAS
    NB: DANS MON CAS J'AI CREER MA BASE DE DONNES EN LOCAL AVEC SQL

    Merci

    vendredi 5 février 2010 12:26
  • Bonjour NOUBISSI,

    Bon, tant mieux si tu as réussi à faire tourner mon exemple, je l'ai écrit vite fait moi-même comme cela j'étais sûr de mon coup ;)

    Alors, de ce que j'en vois sur ton code, il y a un problème avec l'IDTextBox.
    En effet, lorsque tu fais un Add sur un DataBinding, le premier argument contient la Propriété du Control que tu mets à jour.
    En l'occurence, si c'est une TextBox, ca sera "Text", car cela revient à faire : textBox1.Text = UtilisateurBindingSource.ID
    Ensuite, pour les autre TextBox, je ne pense pas que tu aies besoin de préfixer par Utilisateur, seul le nom de la Propriété doit être pris en compte.

    Cordialement,

    Thomas


    Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr
    • Marqué comme réponse Alex Petrescu mardi 9 février 2010 13:48
    vendredi 5 février 2010 14:24
  • Bonjour Thomas,

    Concernant les posts ci-dessus, j'ai pu le réaliser une fois. Même si sur ma petite application proprement dit, ça me dérrange encore, mais je me battrais et j'y arriverais (C'est ça l'école je crois).

    je ne sais pas si c'est le lieu indiqué, mais j'ai besoin d'une orientation.

    Je ne suis pas informaticien de formation, mais la passion m'y a conduit.
    En réalité, j'aimerais y faire carrière et pouvoir développez des applications consistantes et si possible me lancer dans la sécurité informatique. j'ai déjà lu quelques bouquins en visual basic (ce qui m'était plus accessible) et actuellement je suis dans une phase beaucoup plus pratique.

    J'aimerais avoir ton avis et ton orientaion si c'est possible pour une bonne auto formation pour atteindre mon objectif, peu importe le temps que ça me prendra.

    Salutations
    mardi 9 février 2010 13:10
  • Bonjour,

    Thomas, merci pour vos explications.

    Noubissi, merci pour appeler aux services de MSDN France et j’espère que les informations trouvées ici vous ont été utiles. En ce qui concerne les informations que vous avez demandé a Thomas, je vous conseille d’ouvrir aussi un nouveau thread pour être plus visible et pouvoir bénéficier des conseils des autres membres aussi.

     

    Bon courage dans votre étude,

    Alex


    Alex Petrescu - MSFT
    mardi 9 février 2010 13:52
  • Bonjour Noubissi,

    Si jamais tu as d'autres problèmes dans ton application pour mettre en place ta fenêtre de gestion des lignes de ta gridview, ou même ailleurs, n'hésite pas à poser des questions, et en effet, c'est ça l'école ;)

    Me concernant, le schéma directeur pour que j'apprenne est le suivant :

    1. Je cherche

    2a. Je trouve une solution :
    3a. Elle est simple, donc tout va bien, pas besoin de poser de question.
    3b. Elle est complexe, peut-être puis-je me débrouiller autrement, je pose la question.

    2b. Je ne trouve pas de solution, je pose la question.


    Concernant le fait de faire carrière dans l'informatique ...
    Il y a deux axes sur lesquels tu pars, développement et sécurité.
    Ce sont pour moi vraiment deux métiers complètement différents, je pense que quelque part, même si tu as envie de toucher aux deux, il te faudra faire un choix pour ton futur métier.

    Mais Alex a raison, ce n'est pas forcément l'endroit pour en discuter, je t'invite moi aussi à créer un nouveau thread pour avoir les avis d'un peu tout le monde ;)

    A bientôt dans ton nouveau thread pour ta future carrière !

    Thomas




    Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr
    mercredi 10 février 2010 09:49