将 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 视图并在更新后再次保存的主要内容,如果未能解决你的问题,请参考以下文章

在 WPF DataGrid 中使用多个 XML 文档

从 Parsed XML 将数据加载到 Table 视图

wpf数据绑定发生时如何显示加载图形/动画

WPF Datagrid 到 XML [关闭]

在运行时将新表重新加载/替换到 WPF DataGrid 中

重新加载 UITableview 时出现问题..!