2017-10-13 42 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後。

如果應用程序是快速和骯髒的,那麼在按鈕處理程序中做任何你喜歡的事情都可以。但是,如果它是一個真實世界的應用程序,那麼你確實需要有某種應用程序體系結構。

相關問題