2017-10-13 89 views
0

我试图向数据表添加新记录。数据记录将显示在数据网格视图中并写入XML文件。每次我点击buttonCreate创建一条记录,但它会覆盖现有条目而不是添加新记录。如何在不覆盖现有记录的情况下向数据表添加新行?如何在不覆盖现有记录的情况下向数据表添加新行

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"); 
    } 
} 

另外,我应该在表单事件中创建数据表?

回答

1

你的问题是你每次点击按钮时都重新创建数据表。您应该将数据表单声明为Form1类的属性,在Form1()方法中创建列(当表单创建时(即在启动应用程序时),由.net框架调用这些列),然后创建点击按钮上的新行,将其添加到数据表中,并重置gridview以指向数据表以刷新它。

//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

这是一种替代解决方案。虽然当前的实现将会崩溃,但有一个例外:“DataTable已经属于另一个DataSet”。 –

+0

我修改了代码来删除这个bug:P –

1

记录不断得到覆盖由下一个记录,因为这行代码:

ds.WriteXml("Contacts.xml"); 

您需要追加到XML文件,而不是将其覆盖。请参阅this stackoverflow后。

如果应用程序是快速和肮脏的,那么在按钮处理程序中做任何你喜欢的事情都可以。但是,如果它是一个真实世界的应用程序,那么你确实需要有某种应用程序体系结构。

相关问题