在c# /. net中使用数据集向xml文件添加新内容时遇到问题

本文关键字:添加 文件 xml 新内容 问题 遇到 数据集 net | 更新日期: 2023-09-27 18:09:59

我试图使用c#和。net在XML中存储信息,但只有我使用buttonclick事件编写和"提交"到XML的最后一个信息。我之前输入的内容将被覆盖。

这是代码:

private void lagre_Click(object sender, EventArgs e)
    {
        DataTable dt = new DataTable();
        DataColumn dc1 = new DataColumn("Fullt navn");
        DataColumn dc2 = new DataColumn("Start dato");
        DataColumn dc3 = new DataColumn("Antall dager");
        dt.Columns.Add(dc1);
        dt.Columns.Add(dc2);
        dt.Columns.Add(dc3);
        dt.Rows.Add(gjestenavnInput.Text, datoInnsjekk.Text, antallDager.Text);
        DataSet ds = new DataSet();
        ds.Tables.Add(dt);
        ds.WriteXml("gjesteInfo.xml");

        gjesterutenrom.Items.Add(gjestenavnInput.Text);
        gjestenavnInput.Text = "";
        datoInnsjekk.Text = "";
        antallDager.Text = "";

    }

我试图把数据表、数据列和数据集的构造放在按钮事件之外,但是它不会在XML中存储任何数据。也许有一个问题与dt.rows.add等,但我不知道如何写它。什么好主意吗?


谢谢你到目前为止的努力,RyanWH。:)我现在试着玩弄你的建议,也许我误解了一些东西,但这就是我所做的:

private void InitDataTable()
    {
        dt = new DataTable();
        DataSet ds = new DataSet();
        ds.ReadXml("gjesteInfo.xml");
        dt = ds.Tables[0];

        if (dt.Columns == null){
       DataColumn dc1 = new DataColumn("Fullt navn");
       DataColumn dc2 = new DataColumn("Start dato");
       DataColumn dc3 = new DataColumn("Antall dager");
        dt.Columns.Add(dc1);
        dt.Columns.Add(dc2);
        dt.Columns.Add(dc3);
        }
        ds.WriteXml("gjesteInfo.xml");
    }

    private void lagre_Click(object sender, EventArgs e)
    {
        InitDataTable();
        dt.Rows.Add(gjestenavnInput.Text, datoInnsjekk.Text, antallDager.Text);
        gjesterutenrom.Items.Add(gjestenavnInput.Text);
        gjestenavnInput.Text = "";
        datoInnsjekk.Text = "";
        antallDager.Text = "";

    }

产生相同的结果。它将覆盖XML文件中的旧内容。

在c# /. net中使用数据集向xml文件添加新内容时遇到问题

我用David S.建议的合并方法解决了这个问题。

我是这样做的:

    DataTable dt;
    private void InitDataTable()
    {
        dt = new DataTable();
        DataSet ds = new DataSet();
        ds.ReadXml("gjesteInfo.xml");
        ds.Tables.Add(dt);
        DataColumn dc1 = new DataColumn("Fullt navn");
        DataColumn dc2 = new DataColumn("Start dato");
        DataColumn dc3 = new DataColumn("Antall dager");
        dt.Columns.Add(dc1);
        dt.Columns.Add(dc2);
        dt.Columns.Add(dc3);
        dt.Rows.Add(gjestenavnInput.Text, datoInnsjekk.Text, antallDager.Text);
        ds.Merge(dt); //Merging the dataset with the table and preventing it to be overwritten
        ds.WriteXml("gjesteInfo.xml");
    }

    private void lagre_Click(object sender, EventArgs e)
    {
        InitDataTable();
        dt.Rows.Add(gjestenavnInput.Text, datoInnsjekk.Text, antallDager.Text);
        gjesterutenrom.Items.Add(gjestenavnInput.Text);
        gjestenavnInput.Text = "";
        datoInnsjekk.Text = "";
        antallDager.Text = "";

    }

可能,ds.WriteXml("gjesteInfo.xml");会覆盖文件中的所有内容。您需要加载该文件,并将其与新信息合并。也许DataSet s Merge函数在这里会有用。

edit:查看这里,看看哪些函数适合您解决加载->合并->保存的问题http://msdn.microsoft.com/en-us/library/831szy8a.aspx

如果我理解正确,您想在按下按钮时将信息附加到DataTable ?第一行是表的声明,应该为整个类定义,可能就是声明'gjestenavnInput'变量的地方。

    DataTable dt;

这将允许你的按钮函数引用这个数据表,它还允许这个表在你的程序运行时保持持久化。

然后,您需要在构造函数/初始化中使用这些行来创建您的表并设置您的列:

    dt = new DataTable();
    DataColumn dc1 = new DataColumn("Fullt navn");
    DataColumn dc2 = new DataColumn("Start dato");
    DataColumn dc3 = new DataColumn("Antall dager");
    dt.Columns.Add(dc1);
    dt.Columns.Add(dc2);
    dt.Columns.Add(dc3);

你的代码,就像现在一样,每次你点击按钮时,都会创建一个全新的0列0行DataTable。然后,创建并添加三列到表中。最后,向表中添加一行。完成所有的表操作后,将表写入XML,此时表所知道的只有这些:它有3列,有1行。然后,将字段重置为空字符串。

在函数结束时,DataTable对象超出作用域并被删除,这意味着下次单击按钮时将发生完全相同的事情:创建一个0列0行的表,添加三列,添加一行,将其写入XML,并将字段重置为空字符串。

第二个编辑

我修改了一些你更新的代码如下。希望对你有帮助。

private void InitDataTable()
{
    dt = new DataTable();
    DataSet ds = new DataSet();
    ds.ReadXml("gjesteInfo.xml");
    DataTableCollection tables = ds.Tables;
    if (0 == tables.Count){
        DataColumn dc1 = new DataColumn("Fullt navn");
        DataColumn dc2 = new DataColumn("Start dato");
        DataColumn dc3 = new DataColumn("Antall dager");
        dt.Columns.Add(dc1);
        dt.Columns.Add(dc2);
        dt.Columns.Add(dc3);
    }
    else 
    {
        dt = tables[0];
    }
}
private void lagre_Click(object sender, EventArgs e)
{
    InitDataTable();
    dt.Rows.Add(gjestenavnInput.Text, datoInnsjekk.Text, antallDager.Text);
    gjesterutenrom.Items.Add(gjestenavnInput.Text);
    DataSet ds = new DataSet();
    ds.Tables.Add(dt);
    ds.WriteXml("gjesteInfo.xml");
    gjestenavnInput.Text = "";
    datoInnsjekk.Text = "";
    antallDager.Text = "";

}

您需要先读取现有数据,然后添加,然后写入。简要:

dt.ReadXml();
dt.AddRow(...);
dt.WriteXml();

XML文件只是文本文件。你不能写在中间