【问题标题】:How to add new row to data table without overwriting the existing record如何在不覆盖现有记录的情况下向数据表添加新行
【发布时间】:2017-10-13 14:36:58
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# xml datagridview datatable


    【解决方案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");
    }
    

    【讨论】:

    • 这是另一种解决方案。尽管当前的实现会崩溃,但出现以下异常:“DataTable 已经属于另一个 DataSet。”
    【解决方案2】:

    由于这行代码,记录不断被下一条记录覆盖:

     ds.WriteXml("Contacts.xml");
    

    您需要附加到 XML 文件,而不是覆盖它。请参阅thisstackoverflow 帖子。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-09
      • 2016-03-30
      • 1970-01-01
      • 2015-10-11
      • 2023-02-15
      • 2010-09-27
      • 2020-08-30
      相关资源
      最近更新 更多