将 xml 文件加载到 Datagrid 视图并在更新后再次保存
Posted
技术标签:
【中文标题】将 xml 文件加载到 Datagrid 视图并在更新后再次保存【英文标题】:Load an xml file to Datagrid view and saved it again after update 【发布时间】:2016-07-11 10:01:35 【问题描述】:我有一个这样的 xml 文件:
<xml version="1.0" encoding="UTF-8">
<configes>
<Username>Administrator</Username>
<Password>123456</Password>
<Domain>sample</Domain>
<Url>http://sample/Organization.svc</Url>
</configes>
我通过以下方式将其加载到数据网格视图中:
DataGridViewRow row;
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(txtXmlAdd.Text);
XmlElement elm = xmlDoc.DocumentElement;
XmlNodeList nodeList = elm.ChildNodes;
foreach (XmlNode node in nodeList)
row = (DataGridViewRow)dgvXML.Rows[0].Clone();
row.Cells[0].Value = node.Name ;
row.Cells[1].Value = node.InnerText;
dgvXML.Rows.Add(row);
现在,我想更改一些属性(编辑值或添加新属性)并再次将其保存到同一个文件中。 我试试这个,但它不起作用:
DataTable dT = GetDataTableFromDGV(dgvXML);
DataSet dS = new DataSet();
dS.DataSetName = "configes";
dS.Tables.Add(dT);
dS.WriteXml(string path);
当 GetDataTableFromDGV 是这样的时候:
var dt = new DataTable();
dt.TableName="";
string firstCol = "";
string secCol = "";
object[] cellValues = new object[1];
foreach (DataGridViewRow row in dgv.Rows)
secCol = row.Cells[1].Value.ToString();
firstCol = row.Cells[0].Value.ToString();
dt.Columns.Add(firstCol);
cellValues[0] = row.Cells[1].Value;
dt.Rows.Add(cellValues);
return dt;
【问题讨论】:
我发布了不同的答案来解决您的问题,您可以将您的 xml 文件用作 DataTable :),我的答案在这里:***.com/questions/38261881/… 和这里***.com/questions/38180836/… 正如我在问题中所说,我可以毫无问题地加载 xml 文件。我只是想在更新 DGV 后以相同的格式保存它。 c# Save DataGridView to Xml file的可能重复 【参考方案1】:做起来简单。
定义表单域(不是局部变量):
DataSet dataSet = new DataSet();
从文件中加载数据:
dataSet.ReadXml(filename);
将 DataTable 绑定到 DataGridView:
dataGridView.DataSource = dataSet.Tables[0];
数据将显示在 DataGridView 中。现在您可以编辑它们了。
将数据保存到文件中:
dataSet.Tables[0].WriteXml(filename);
如果您想在一行中显示每一列及其值,那么您有两个变体。
修改xml文件格式如下:
<?xml version="1.0" encoding="utf-8"?>
<Root>
<configes>
<Name>UserName</Name>
<Value>Administrator</Value>
</configes>
<configes>
<Name>Password</Name>
<Value>123456</Value>
</configes>
<configes>
<Name>Domain</Name>
<Value>sample</Value>
</configes>
<configes>
<Name>Url</Name>
<Value>http://sample/Organization.svc</Value>
</configes>
</Root>
在这种情况下,您可以使用上面简短而干净的 C# 代码。
如果你不能改变xml文件的格式,那么你必须手动解析它并将值放入DataTable中。
【讨论】:
现在在 datagridview xml 文件中显示在一行和不同的列中(与 xml 节点一样多)。如何在一行中显示每一列及其值?【参考方案2】:正如我在评论中告诉您的那样,您的问题的解决方案在这里的旧答案中:Editing xml on live in C#. Deleting nodes that contain specific value
但如果你愿意,我可以为你重写这个......
假设您将 xml 文件存储在 dataTable 中,如果您编辑此 dataTable 中的数据,您可以像第一个一样重写您的 xml 文件。
//READ THE XML FILE
XmlDocument xmlDoc = new XmlDocument();
//My path
xmlDoc.LoadXml(Properties.Resources.test);
//Read the xml file into a dataSet
DataSet ds = new DataSet();
XmlNodeReader xnr = new XmlNodeReader(xmlDoc);
ds.ReadXml(xnr);
//Your data will be store in the 4's dataTable of the dataSet ( the <field> )
for (int i = 0; i < ds.Tables[0].Columns.Count; i++)
//RemoteAt will remove all the node, so the node <Field> in your example data
ds.Tables[0].Rows[0][i] = "NEWVALUE";
//If you want to only remove the node <Value> (and not all the <Field> node ) just do ds.Tables[4].Rows["Value"]=null;
//Write your new content in a new xml file
//As you wanted here you just read the new xml file created as a string
using (var stringWriter = new StringWriter())
using (var xmlTextWriter = XmlWriter.Create(stringWriter))
ds.WriteXml(xmlTextWriter);
xmlTextWriter.Flush();
stringWriter.GetStringBuilder().ToString();
//Here the result is in stringWriter, and there is 6 <Field> nodes, and not 8 like before the suppress
//If you want to create a new xml file with the new content just do
ds.WriteXml(pathOfTheFirstXmlFile);
//( like rewriting the previous xml file )
我的输入:(test.xml)
<?xml version="1.0" encoding="UTF-8"?>
<configes>
<Username>Administrator</Username>
<Password>123456</Password>
<Domain>sample</Domain>
<Url>http://sample/Organization.svc</Url>
</configes>
我在前面代码之后的输出:
<?xml version="1.0" standalone="yes"?>
<configes>
<Username>NEWVALUE</Username>
<Password>NEWVALUE</Password>
<Domain>NEWVALUE</Domain>
<Url>NEWVALUE</Url>
</configes>
【讨论】:
以上是关于将 xml 文件加载到 Datagrid 视图并在更新后再次保存的主要内容,如果未能解决你的问题,请参考以下文章