如何在不覆盖现有记录的情况下将新行添加到数据表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在不覆盖现有记录的情况下将新行添加到数据表相关的知识,希望对你有一定的参考价值。

我正在尝试将新记录添加到数据表中。数据记录将显示在数据网格视图中并写入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");
    }
}

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

答案

您的问题是每次单击按钮时都要重新创建数据表。您应该将datatable声明为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帖子。

如果应用程序快速而且脏,那么可以在按钮处理程序中执行任何您喜欢的操作。但是,如果它是一个真实的应用程序,那么你真的需要有一些应用程序架构。

以上是关于如何在不覆盖现有记录的情况下将新行添加到数据表的主要内容,如果未能解决你的问题,请参考以下文章

如何在不覆盖以前数据的情况下将数据添加到 XML 文件(C#)

无法在不覆盖的情况下将 R 数据框附加到现有 Excel 中

如何在不丢失表格视图单元格的情况下将现有集合视图添加到表格视图

SSAS - 是不是可以在不重新部署整个多维数据集的情况下将属性添加到现有维度

如何在不为 Java Bridge 添加 tomcat 服务器的情况下将 Java 后端添加到现有 PHP 站点?

以角度将行附加到现有数据列表