如何在不覆盖现有记录的情况下向数据表添加新行
问题描述:
我试图向数据表添加新记录。数据记录将显示在数据网格视图中并写入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");
}
}
另外,我应该在表单事件中创建数据表?
答
你的问题是你每次点击按钮时都重新创建数据表。您应该将数据表单声明为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");
}
答
记录不断得到覆盖由下一个记录,因为这行代码:
ds.WriteXml("Contacts.xml");
您需要追加到XML文件,而不是将其覆盖。请参阅this stackoverflow后。
如果应用程序是快速和肮脏的,那么在按钮处理程序中做任何你喜欢的事情都可以。但是,如果它是一个真实世界的应用程序,那么你确实需要有某种应用程序体系结构。
这是一种替代解决方案。虽然当前的实现将会崩溃,但有一个例外:“DataTable已经属于另一个DataSet”。 –
我修改了代码来删除这个bug:P –