在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文件中的旧内容。
我用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文件只是文本文件。你不能写在中间