0

我正在尝试使用 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 = "";


    }

我试图将 DataTable、DataColumn 和 Dataset 的构造放在按钮事件之外,但它不会在 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 文件中的旧内容。

4

4 回答 4

1

我使用 David S 建议的 Merging 解决了它。

这是我所做的:

    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 = "";


    }
于 2013-04-19T09:26:05.697 回答
0

如果我理解正确,您想在按下按钮时将信息附加到您的 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 = "";


}
于 2013-04-18T17:33:22.690 回答
0

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

编辑:在这里查看哪些功能适合您解决加载->合并->保存的问题http://msdn.microsoft.com/en-us/library/831szy8a.aspx

于 2013-04-18T17:45:39.437 回答
0

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

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

XML 文件只是文本文件。你不能写到他们中间。

于 2013-04-19T14:59:03.563 回答