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

C# Discussion :

Insertion d'enregistrement avec BindingSource [Débutant]


Sujet :

C#

  1. #1
    Membre régulier Avatar de windmastr26
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 234
    Points : 108
    Points
    108
    Par défaut Insertion d'enregistrement avec BindingSource
    Bonjour à toutes et tous,

    Je commence tout juste dans le développement en c# (Visual C#), et j'aurais besoin de votre aide.

    J'essaye de lier mon appli avec ma BDD. Je suis d'abord passer par une alimentation des champs et de ma base en manuel à coup de fonctions MySql. Tout fonctionnait bien. Puis je suis tombé sur un article qui parlait du "BindingSource" et ça m'a paru beaucoup plus adapté (pourquoi réinventer la roue ?...). J'ai donc cherché des ressources sur le BindingSource mais soit je ne trouve rien, soit ça ne correspond pas, soit c'est moi qui ne comprends pas !!

    1. J'ai créé une base de données MySQL et dans mon projet j'ai ajouté une nouvelle connexion BDD, ce qui a eu pour effet de me créer un dataset avec un datatable par table.
    2. Sur ma winform, j'ai ajouté un bindingsource que j'ai lié à ma bdd (datasource) puis à la table correspondante (datamember). Ça m'a automatiquement créé un TableAdapter.
    3. J'ai ensuite relié chaque champ de ma form aux champs de ma table via mon bindingsource (propriété "DataBindings.Text" du champ).


    J'arrive bien via cette organisation à lire un enregistrement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    this.MonBindingSource.Filter = "tbl_id=" + this.ID.ToString();
    this.MonTableAdapter.Fill(this.MaBDD.MaTable);
    Par contre, si je souhaite créer un enregistrement, ça ne fonctionne pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    private void MaForm_Load(object sender, EventArgs e)
    {
       this.MonBindingSource.AddNew();
    }
     
    [...]
     
    private void MonButton_click(object sender, EventArgs e)
    {
       this.MonBindingSource.EndEdit();
       this.MonTableAdapter.Update(this.MaBDD.MaTable);
    }

    Pourriez-vous me dire svp :
    • Dans un premier temps si mon organisation dans son ensemble est viable
    • Qu'est-ce que j'ai oublié de faire pour enregistrer mes données dans ma base...


    Un grand merci pour le coup de main

  2. #2
    Membre régulier Avatar de windmastr26
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 234
    Points : 108
    Points
    108
    Par défaut
    Pour l'instant j'ai pu ajouter un enregistrement en opérant de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DataRow ligne = this.maBDD.maTable.NewRow();
    ligne["Champ1"] = champ1.Text;
    ligne["Champ2"] = champ2.Text;
    [...]
    this.maBDD.maTable.Rows.Add(ligne);
    this.maTableAdapter.Update(this.maBDD.maTable);
    Je pensais qu'il y avait une possibilité pour lui dire de récupérer automatiquement tous les champs de la form associés à cette table, et de les utiliser pour mon insertion. Mais visiblement je dois les reprendre un par un... Dommage

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 116
    Points : 158
    Points
    158
    Par défaut
    As tu regardé du côté du connector ADO.NET de MySql?


    Je pense que cela pourra t'aider à créer ton interaction BDD/projet c#, pour avoir une data table de façon plus simple.

    ps : je ne connais pas trop ADO.NET de MySql (je n'utilise pas ce type de base)donc je ne vais pas pouvoir t'aider plus que ça, mais je pense que la doc doit être assez fournies pour t'aider.

    http://dev.mysql.com/downloads/connector/net/

  4. #4
    Membre régulier Avatar de windmastr26
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 234
    Points : 108
    Points
    108
    Par défaut
    Malheureusement j'avais vu cette API mais aucune méthode ne permet d'obtenir le résultat que je souhaite...

    A savoir, récupérer en une commande les champs de ma fenêtre pour les insérer dans ma base (sans passer par une assignation pour chaque champ)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ligne["Champ1"] = champ1.Text;
    ligne["Champ2"] = champ2.Text;
    Tant pis, je vais me résoudre à utiliser les BindingSource pour la lecture (car bien pratiques quand même), mais conserver mes instructions MySQL pour l'écriture...

  5. #5
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour

    Bizarre ,bizarre ...C'est un peu complique là..

    1/A partir du designer ajoute :
    -ton dataset
    -ton tableadapter
    -ton bindingsource
    -un bindingnavigator dont la prop bindingsource esr lie à ton bindingsource .
    Il comporte un bouton croix "+" pour ajouter un nouvel enreg...et qui permet aussi de naviguer dans les enregs pour modifs eventuelles...
    2/dans le designer toujours
    - fais ce qui suit pour tes controls textboxes un à un
    ->databindings ->text ->selectionne ton bindingsource et le champ approprie
    ->databindings ->avances ->combox mode de mise à jour datasource :selectionne OnPropertyChanged

    pour le reste voici le simplistic code behind .cs qui permet aussi bien d'ajouter un nouvel enreg que de modifier l'existant.Le bouton savechanges est active des que un enreg est modifie ou un nouvel enreg est ajoute grace à l'event listchanged de la liste sous-jacent(le datatable)..

    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
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Data.OleDb;
     
    namespace WinDataView
    {
        public partial class Form2 : Form
        {
     
     
            public Form2()
            {
                InitializeComponent();
                btnSaveChanges.Enabled = false;
            }
     
     
            private void Form2_Load(object sender, EventArgs e)
            {
     
                productsTableAdapter1.Fill(productsDataSet1.Products);
                productsBindingSource.ListChanged += new ListChangedEventHandler(productsBindingSource_ListChanged);
            }
     
            void productsBindingSource_ListChanged(object sender, ListChangedEventArgs e)
            {
                btnSaveChanges.Enabled = true;
                productsBindingSource.EndEdit();
            }
     
     
     
     
            private void btnSaveChanges_Click(object sender, EventArgs e)
            {
     
                this.productsTableAdapter1.Update(productsDataSet1.Products);
     
     
            }
     
     
     
     
     
        }
    }
    bon code......

  6. #6
    Membre régulier Avatar de windmastr26
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 234
    Points : 108
    Points
    108
    Par défaut
    Bonjour MABROUKI,

    Effectivement je procède de la même façon :

    • J'ai créé mon DataSet avec mes DataTable + TableAdapter,
    • Sur ma fiche j'ai ajouté un BindingSource (ce qui a ajouté automatiquement le TableAdapter correspondant),
    • A la fin du traitement (Btn Enregistrer) j'applique le code suivant :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    this.MonBindingSource.EndEdit();
    this.MonTableAdapter.Update(this.MaBDD.MaTable);
    Et malgré tout ça ne fonctionne pas...

    Ce qui est "marrant", c'est que si je charge un enregistrement et qu'ensuite je clic sur mon bouton "Enregistrer", ça me prend bien en compte mes modifications :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    this.MonBindingSource.Filter = "tbl_id=" + this.ID.ToString();
    this.MonTableAdapter.Fill(this.MaBDD.MaTable);
    Cela vient donc de la méthode pour dire que l'enregistrement courant est un nouveau. J'ai pourtant essayé bon nombre de choses...

  7. #7
    Membre régulier Avatar de windmastr26
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 234
    Points : 108
    Points
    108
    Par défaut
    A tout hasard, si quelqu'un un jour est dans la même difficulté que moi, voici comment j'ai résolu le "problème" :

    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
    private void MaForm_Load(object sender, EventArgs e)
    {
       if (this.ID > 0) //ID représentant l'ID de l'enregistrement à modifier
       {
          this.MonBindingSource.Filter = "id=" + this.ID.ToString();
          this.MonTableAdapter.Fill(this.MaBDD.MaTable);
       }
       else
       {
          this.MonBindingSource.AddNew();
       }
    }
     
    [...]
     
    private void btnValider_Click(object sender, EventArgs e)
    {
       this.MonBindingSource.EndEdit();
       this.MonTableAdapter.Update(this.MaBDD.MaTable);
    }
    A bon entendeur...

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

Discussions similaires

  1. Ajouter un enregistrement avec INSERT INTO
    Par Amani El Hammi dans le forum Forms
    Réponses: 8
    Dernier message: 17/01/2013, 02h56
  2. Réponses: 1
    Dernier message: 07/02/2010, 12h51
  3. pb d'insertion d'enregistrement avec derby
    Par mouss4rs dans le forum Langage SQL
    Réponses: 1
    Dernier message: 22/05/2008, 11h46
  4. [C#]Probleme insertion de donee avec bindingsource
    Par pas05 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 11/04/2006, 00h08
  5. insertion d'enregistrement avec MySQL Administrator
    Par Lady_jade dans le forum Outils
    Réponses: 1
    Dernier message: 08/09/2005, 16h04

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