none
Ajouter une colonne dans la Base de données et répercuter ce changement dans le datagriedview RRS feed

  • Question

  • Bonjour,

    Je code une petite application pour une BDD (.mdf) personnelle avec Visual Studio 2013 en vb. Elle est composée de deux tables. Comme cette bdd sera installée sur mon laptop et que je n'ai pas envie de recommencer chaque fois le travail sur Visual Studio via mon pc principal, j'aimerais trouver un moyen d'ajouter une colonne dans ma base de données à travers l'application (donc une fois finie) et que cette nouvelle colonne soit affichée dans mes différents DataGridview. (ex: insérer une colonne "CATEGORIE" (bit (booléen), null autorisé) dans la table "PATATE").

    Pour l'instant, ma méthode consiste à créer une colonne dans une table au moyen d'un formulaire que j'ai créé:

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        If table.Text <> "" And colonne.Text <> "" And typede.Text <> "" Then
             cn.Open()
             cmd.CommandText = "ALTER TABLE " & table.Text & " ADD " & colonne.Text & " " & typede.Text & ""
             cmd.ExecuteNonQuery()
             cn.Close()
             table.Text = ""
             colonne.Text = ""
             typede.Text = ""
        Else
             MsgBox("Vous devez remplir les trois champs!")
        End If
    End Sub

    En regardant dans Visual Studio, j'ai constaté que la colonne était bel et bien ajoutée à ma table. Pour l'instant, j'essaye de trouver un moyen de répercuter ce changement structurel dans le dataset/datagridview mais, peu importe ce que j'essaye (sans compter que je n'y connais rien et tâtonne), je n'y parviens pas.

    Du coup, je viens demander un peu d'aide pour savoir si:

    1) Je m'y prends de la bonne façon;

    2) Existe-t-il une façon de parvenir au même résultat d'une autre manière;

    3) Vous connaissez le code pour répercuter ces changements dans mes datagridview

    Je vous remercie d'avance!

    Edit: J'ai oublié de préciser mais, pour l'instant, les Datagridview sont ceux générés par mon dataset (glisser/déposer dans un window form), je n'ai rien codé de ce côté-là.

    • Modifié Torgoth mardi 28 avril 2015 13:59
    mardi 28 avril 2015 13:56

Réponses

  • Bonjour,

    Pour faire ce que vous souhaitez les tables doivent posséder un index en commun

    Par exemple

    Table TblAuteur

    index<compteur>,Nom,Prénom

    Table TblOuvrage

    index<compteur>, idAuteur,titre etc.

    Pour filtrer vous pouvez créez des objets DataView

    Par exemple

    Les tables doivent ressembler à ceci

    0,Hugo,Victor
    1,Aragon,Louis
    2,Havet,Mireille

    Les ouvrages
    0,0,Les Misérables
    1,0,Notre Dame de Paris
    2,0,Hernani
    3,1,Aurélien
    4,1,Les cloches de Bâle
    5,1,Les beaux quartiers
    6,2,Carnaval
    6,2,Journal

    DataView l_VueAuteur=new DataView();
    l_VueAuteur.Table=Auteur;
    l_VueAuteur.sort="Nom";
    l_VueAuteur.Rowfilter="(Nom='"+ varNom + "');

    DataGridView  = new DataGridView()
    l_VWauteur.DataSource=l_VueAuteur;

    On récupère l'ID de l'auteur, c'est à dire l'index de la première colonne de la table TblAuteur qui a du être reporté dans la colonne IdAuteur de la table TblOuvrage
    int idAuteur = (int )l_VueAuteur[0][0];

    DataView l_VueOuvrage = new DataView();

    l_VueOuvrage.Table=TblOuvrage;
    l_VueOuvrage.sort="Titre";
    l_VueOuvrage.Rowfilter="(idAuteur='"+ idAuteur + "');

    DataGridView l_VWOuvrage = new DataGridView()
    l_VW.DataSource=l_VueOuvrage;

    Cordialement
    Gérard

    • Proposé comme réponse GP79 jeudi 30 avril 2015 07:14
    • Modifié GP79 samedi 2 mai 2015 08:44
    • Marqué comme réponse Teodora SharkovaModerator lundi 5 octobre 2015 09:52
    jeudi 30 avril 2015 07:03

Toutes les réponses

  • Bonjour,

    Cela dépend de la requête, si vous avez un select * from tblXX vous récupérez toutes les colonnes et elles seront affichées. Il faut rafraichir le gridView.

    Cordialement
    Gérard

    mardi 28 avril 2015 15:07
  • Bonjour!

    Merci pour votre conseil, j'ai trouvé une méthode. Maintenant, mon soucis, c'est que j'essaye d'avoir un affichage dans deux DataGridView, l'un parent et l'autre enfant et je ne parviens pas à faire correspondre les deux, au sens que si je clique sur un enregistrement de la table parent, le second datagridview n'affiche pas les enfants comme je le souhaiterais. Ca fait 6 heures que je suis là-dessus et ça commence à m'agacer.

    mercredi 29 avril 2015 19:03
  • Bonjour,

    Pour faire ce que vous souhaitez les tables doivent posséder un index en commun

    Par exemple

    Table TblAuteur

    index<compteur>,Nom,Prénom

    Table TblOuvrage

    index<compteur>, idAuteur,titre etc.

    Pour filtrer vous pouvez créez des objets DataView

    Par exemple

    Les tables doivent ressembler à ceci

    0,Hugo,Victor
    1,Aragon,Louis
    2,Havet,Mireille

    Les ouvrages
    0,0,Les Misérables
    1,0,Notre Dame de Paris
    2,0,Hernani
    3,1,Aurélien
    4,1,Les cloches de Bâle
    5,1,Les beaux quartiers
    6,2,Carnaval
    6,2,Journal

    DataView l_VueAuteur=new DataView();
    l_VueAuteur.Table=Auteur;
    l_VueAuteur.sort="Nom";
    l_VueAuteur.Rowfilter="(Nom='"+ varNom + "');

    DataGridView  = new DataGridView()
    l_VWauteur.DataSource=l_VueAuteur;

    On récupère l'ID de l'auteur, c'est à dire l'index de la première colonne de la table TblAuteur qui a du être reporté dans la colonne IdAuteur de la table TblOuvrage
    int idAuteur = (int )l_VueAuteur[0][0];

    DataView l_VueOuvrage = new DataView();

    l_VueOuvrage.Table=TblOuvrage;
    l_VueOuvrage.sort="Titre";
    l_VueOuvrage.Rowfilter="(idAuteur='"+ idAuteur + "');

    DataGridView l_VWOuvrage = new DataGridView()
    l_VW.DataSource=l_VueOuvrage;

    Cordialement
    Gérard

    • Proposé comme réponse GP79 jeudi 30 avril 2015 07:14
    • Modifié GP79 samedi 2 mai 2015 08:44
    • Marqué comme réponse Teodora SharkovaModerator lundi 5 octobre 2015 09:52
    jeudi 30 avril 2015 07:03