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

VB.NET Discussion :

Ajout d'une colonne sur un DataGridView et enregistrement dans la table respective


Sujet :

VB.NET

  1. #1
    Membre averti Avatar de Faladin
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 333
    Points : 305
    Points
    305
    Par défaut Ajout d'une colonne sur un DataGridView et enregistrement dans la table respective
    Bon lundi à tous!

    J'utilise un DataGridView (DGV) pour afficher une table qui est dans ma base de donnée SQL CompactEdition. Je réussi à bien afficher ma table, entrée de nouvelles données et les sauvegarder.

    Par contre, mon problème se situe au niveau de l'ajout de colonne. J'ai créer dans ma form un bouton "Ajouter Colonne". J'aimerais, lorsqu'appuyer, que l'utilisateur entre le nom de la colonne ainsi que son type (Bool, String, Integer, etc.). Je réussi à ajouter la colonne mais j'ai l'impression qu'elle ne s'ajoute que sur le DGV et non dans la table source et lorsque j'enregistre, ferme la fenêtre et l'ouvre à nouveau, la nouvelle colonne n'apparaît pas!

    Voici le code d'enregistrement

    Pour info:
    • Tableau = form sur laquelle le DGV est...
    • Tableau.DA = DataAdaptatater
    • Tableau.DataSet1 = Dataset pour la table


    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
        Public Shared Function EnregistrerTable(ByVal nom_table As String)
            Dim flag As Boolean = False
     
            connection.Close()
            connection.Open()
     
            Try
                Dim objetCB = New SqlServerCe.SqlCeCommandBuilder(Tableau.DA)
                Tableau.DA.Update(Tableau.DataSet1, nom_table)
                Tableau.DataSet1.Clear()
                Tableau.DA.Fill(Tableau.DataSet1, nom_table)
                connection.Close()
                flag = True
            Catch ex As Exception
                MsgBox("Erreur SQL (2002): " + ex.Message.ToString, MsgBoxStyle.Exclamation, "Erreur")
            End Try
     
            Return flag
     
        End Function
    Bon avec ce code mes modifs sont bien enregistrés, je peux ajouter/supprimer/modifier des lignes.

    Ensuit voici le code de mon ajout de colonne (qui ne fct pas!)

    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
        Public Shared Sub AjouterColonne(ByVal nom_table As String)
            Dim nom_col As String = ""
            Dim data_type As String = "String"
            Dim new_col As DataColumn
            'Dim DAstring As String = "UPDATE " + nom_table
     
            'Type de colonne string par défaut
            type_colonne = 2
     
            'Tant que le nom de la colonne n'a pas été entré, on boucle
            While nom_col = ""
                nom_col = InputBox("Nom de la colonne à ajouter?", "Nommer colonne").ToString
            End While
     
            Dim flag As Boolean = False
     
            'Je vérifie pour ne pas ajouter une colonne avec un nom existant
            For i = 0 To Tableau.DataGridView1.Columns.Count - 1
                If Tableau.DataGridView1.Columns(i).Name.ToLower = nom_col.ToLower Then
                    flag = True
                    Exit For
                End If
            Next
     
     
            If flag = False Then 'Si le nom est disponible
     
                'Ouverture de la form qui demande le choix (style checkbox)
                ChoixType.ShowDialog()
     
                'Choix restraint selon ces 5 types, d'où le SELECT CASE
                Select Case type_colonne
                    Case 1
                        data_type = "Boolean"
                    Case 2
                        data_type = "String"
                    Case 3
                        data_type = "Double"
                    Case 4
                        data_type = "Int32"
                    Case 5
                        data_type = "DateTime"
                End Select
     
                'Je crée l'objet DataColumn avec sont type
                new_col = New DataColumn(nom_col)
                new_col.DataType = Type.GetType("System." + data_type)
     
                'C'est ici que je suis pas du tout sûr de moi...héhé
                'J'insère la colonne dans le dataset
                Tableau.DataSet1.Tables(nom_table).Columns.Add(new_col)
                Tableau.DataSet1.AcceptChanges()
     
                'J'update la table à l'aide du DA et d'une commande SQL "UPDATE"
                Tableau.DA.UpdateCommand = New SqlServerCe.SqlCeCommandBuilder(Tableau.DA).GetUpdateCommand
                Tableau.DA.Update(Tableau.DataSet1, nom_table)
     
                'un autre essai infructueux
                'Tableau.DA.UpdateCommand = New SqlServerCe.SqlCeCommand(DAstring, connection)
                'Tableau.DA.Fill(Tableau.DataSet1, nom_table)
     
                'Je refresh le DGV avec ce qui serait la nouvelle table (+1 colonne)
                'Par contre ici ce qui se passe c'est que la colonne reste dans le DGV, mais
                'si j'avais modifier des valeurs avant d'enregistrer, les valeurs disparaissent.
                'si je ferme la form, ma colonne est perdu complètement.
                Tableau.DataGridView1.Refresh()
            Else
                MsgBox("(" + nom_col.ToUpper + ")" + " existe déjà!", MsgBoxStyle.Critical, "Ajout annulé...")
            End If
        End Sub
    J'ai essayer de batir une commande UPDATE, sans succès.
    J'ai essayer avec le code ci-haut, sans succès.

    Ma théorie est que je dois updater le Dataset et ensuite utiliser le DA pour faire l'update de la dataset vers la table source, mais de toute évidence je fais une erreur quelque part.

    Quelqu'un a une idée?

    Merci d'Avance...

    JP
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods


    JP

    Pour commencer en VB.Net: PLASSERRE!

    ou traducteur-sms.com

  2. #2
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.

    Ca n'est pas possible. L'ajout d'une colonne au DGV ne déclenchera jamais l'ajout de la colonne dans la table en base (ça n'est pas dans l'objectif du DGV de faire cela).

    Donc au pire, tu vas devoir passer par un ordre sql de type "alter tablemachin add column..." pour créer la colonne en base et au mieux passer par un objet tout fait de manipulation des tables de la base (ça doit bien exister mais je ne connais pas ).

    Cdt.
    Bon à savoir : la touche F1 ne sert pas à commander des places pour le grand prix de Belgique.

  3. #3
    Membre averti Avatar de Faladin
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 333
    Points : 305
    Points
    305
    Par défaut
    Dans le fond ce que tu me dis c'est que le DGV (avec Dataset et DA) ne fonctionne que dans un sens, soit pour lire les valeurs? Par contre je peux les modifier et les enregistrés, donc nécessairement il peut écrire dans la table. Peut-être ne peut-il pas altéré la table, ça je ne sais pas?

    Je vais essayer de m'aventurer un peu plus en SQL et bâtir une commande alter. Merci!

    JP
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods


    JP

    Pour commencer en VB.Net: PLASSERRE!

    ou traducteur-sms.com

  4. #4
    Membre averti Avatar de Faladin
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 333
    Points : 305
    Points
    305
    Par défaut Victoire!
    Merci Olsimare, ça fonctionne à merveille! Voici mon code fonctionnel pour la postérité:

    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
        Public Shared Sub AjouterColonne(ByVal nom_table As String)
            Dim nom_col As String = ""
            Dim data_type As String = "String"
            Dim DAstring As String = "ALTER TABLE " + nom_table + " ADD "
     
            'Type de colonne string par défaut
            type_colonne = 2
     
            'Tant que le nom de la colonne n'a pas été entré, on boucle
            While nom_col = ""
                nom_col = InputBox("Nom de la colonne à ajouter?", "Nommer colonne").ToString
            End While
     
            Dim flag As Boolean = False
     
            'Je vérifie pour ne pas ajouter une colonne avec un nom existant
            For i = 0 To Tableau.DataGridView1.Columns.Count - 1
                If Tableau.DataGridView1.Columns(i).Name.ToLower = nom_col.ToLower Then
                    flag = True
                    Exit For
                End If
            Next
     
     
            If flag = False Then 'Si le nom est disponible
                'Ouverture de la form qui demande le choix (style checkbox)
                ChoixType.ShowDialog()
     
                'Choix restraint selon ces 5 types, d'où le SELECT CASE
                Select Case type_colonne
                    Case 1
                        data_type = " BIT"
                    Case 2
                        data_type = " NVARCHAR(100)"
                    Case 3
                        data_type = " REAL"
                    Case 4
                        data_type = " INT"
                    Case 5
                        data_type = " DATETIME"
                End Select
     
                DAstring = DAstring + nom_col + data_type
     
                connection.Close()
                connection.Open()
                BD.Requete(DAstring)
                Tableau.DataSet1.Clear()
                Tableau.DA.Fill(Tableau.DataSet1, nom_table)
     
            Else
                MsgBox("(" + nom_col.ToUpper + ")" + " existe déjà!", MsgBoxStyle.Critical, "Ajout annulé...")
            End If
        End Sub
    Avec la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        Private Shared Sub Requete(ByVal requete As String)
            Dim cmd As New SqlServerCe.SqlCeCommand(requete, connection)
            cmd.ExecuteNonQuery()
        End Sub
    Merci beaucoup!
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods


    JP

    Pour commencer en VB.Net: PLASSERRE!

    ou traducteur-sms.com

  5. #5
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.

    Super .

    Penses au

    Cdt.
    Bon à savoir : la touche F1 ne sert pas à commander des places pour le grand prix de Belgique.

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 24/02/2013, 20h38
  2. DataGridView, binder une colonne sur un tableau
    Par beren.kei dans le forum Windows Forms
    Réponses: 13
    Dernier message: 13/01/2010, 09h04
  3. Réponses: 8
    Dernier message: 25/05/2009, 13h40
  4. Réponses: 1
    Dernier message: 01/09/2008, 15h56
  5. Réponses: 7
    Dernier message: 01/03/2006, 18h14

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