2017-10-13 3 views
0

J'essaie d'ajouter de nouveaux enregistrements à une table de données. Les enregistrements de données s'afficheront dans une vue de grille de données et écriront dans un fichier XML. Chaque fois que je clique sur le bouton Créer un enregistrement est créé mais il écrase l'entrée existante au lieu d'ajouter un nouvel enregistrement. Comment ajouter une nouvelle ligne à la table de données sans écraser l'enregistrement existant?Comment ajouter une nouvelle ligne à la table de données sans écraser l'enregistrement existant

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void buttonCreate_Click(object sender, EventArgs e) 
    { 
     //create the DataTable 
     DataTable dt = new DataTable("Contact"); 
     //dt.TableName = "Contact"; 

     //create columns for the DataTable 
     DataColumn dc1 = new DataColumn("Id"); 
     dc1.DataType = System.Type.GetType("System.Int32"); 
     dc1.AutoIncrement = true; 
     dc1.AutoIncrementSeed = 1; 
     dc1.AutoIncrementStep = 1; 
     DataColumn dc2 = new DataColumn("Name"); 
     DataColumn dc3 = new DataColumn("Age"); 
     DataColumn dc4 = new DataColumn("Gender"); 

     //add columns to the DataTable 
     dt.Columns.Add(dc1); 
     dt.Columns.Add(dc2); 
     dt.Columns.Add(dc3); 
     dt.Columns.Add(dc4); 

     DataRow row; 

     row = dt.NewRow(); 
     row["Name"] = textBoxName.Text; 
     row["Age"] = textBoxAge.Text; 
     row["Gender"] = textBoxGender.Text; 

     dt.Rows.Add(row); 
     //insert data in the row 
     //dt.Rows.Add(null, textBoxName.Text, textBoxAge.Text, textBoxGender.Text); 
     dataGridView1.DataSource = dt; 

     //create DataSet 
     DataSet ds = new DataSet(); 
     ds.DataSetName = "AddressBook"; 
     ds.Tables.Add(dt); 

     ds.WriteXml("Contacts.xml"); 
    } 
} 

De même, devrais-je créer la datatable dans l'événement de formulaire?

Répondre

1

Votre problème est que vous recréerez le datatable chaque fois que le bouton est cliqué. Vous devez déclarer le datatable en tant que propriété de la classe Form1, créer les colonnes dans la méthode Form1() appelée par le framework .net lors de la création du formulaire (c'est-à-dire lorsque vous démarrez votre application), puis créer votre nouvelle ligne sur le bouton cliquer, l'ajouter au datatable, et réinitialiser le gridview pour pointer sur le datatable pour l'actualiser.

//create the DataTable 
DataTable dt = new DataTable("Contact"); 
DataSet ds; 

public Form1() 
{ 
    InitializeComponent(); 

    //create columns for the DataTable 
    DataColumn dc1 = new DataColumn("Id"); 
    dc1.DataType = System.Type.GetType("System.Int32"); 
    dc1.AutoIncrement = true; 
    dc1.AutoIncrementSeed = 1; 
    dc1.AutoIncrementStep = 1; 

    //add columns to the DataTable 
    dt.Columns.Add(dc1); 
    dt.Columns.Add(new DataColumn("Name")); 
    dt.Columns.Add(new DataColumn("Age")); 
    dt.Columns.Add(new DataColumn("Gender")); 

    //create DataSet 
    DataSet ds = new DataSet(); 
    ds.DataSetName = "AddressBook"; 
    ds.Tables.Add(dt); 

} 

private void buttonCreate_Click(object sender, EventArgs e) 
{ 
    DataRow row = dt.NewRow(); 
    row["Name"] = textBoxName.Text; 
    row["Age"] = textBoxAge.Text; 
    row["Gender"] = textBoxGender.Text; 

    dt.Rows.Add(row); 
    dataGridView1.DataSource = dt; 
    ds.WriteXml("Contacts.xml"); 
} 
+0

Ceci est une solution alternative. Bien que l'implémentation en cours se bloque avec l'exception: "DataTable appartient déjà à un autre DataSet." –

+0

J'ai modifié le code pour supprimer ce bug: P –

1

L'enregistrement ne cesse de s'écrasé par l'enregistrement suivant à cause de cette ligne de code:

ds.WriteXml("Contacts.xml"); 

Vous devez ajouter au fichier XML, pas la remplacer. Voir this post stackoverflow.

Si l'application est rapide et sale, il est bon de faire ce que vous voulez dans le gestionnaire de boutons. Cependant, si c'est une application du monde réel, alors vous avez vraiment besoin d'avoir une sorte d'architecture d'application en place.