C# 使用DataTable在Datagridview中保存XML文件,而不向XML文件添加DataTable.Name

C# 使用DataTable在Datagridview中保存XML文件,而不向XML文件添加DataTable.Name,c#,xml,datagridview,datatable,C#,Xml,Datagridview,Datatable,语言:C# 我想保存从DataTable加载到DataGridView的XML文件。我知道为了使用.WriteXML(),我必须给DataTable指定一个名称。我的问题是,当我这样做时,DataTable名称就被用作XML文件中每个元素的包装器。我不想发生这种事。我只想编辑XML文件的值,并将其保持在相同的布局中 这就是我的代码被放入DataTable和DataGridView的方式: string pathOfXML = C:\\FIlePath; DataTable dt = new D

语言:C#

我想保存从DataTable加载到DataGridView的XML文件。我知道为了使用.WriteXML(),我必须给DataTable指定一个名称。我的问题是,当我这样做时,DataTable名称就被用作XML文件中每个元素的包装器。我不想发生这种事。我只想编辑XML文件的值,并将其保持在相同的布局中

这就是我的代码被放入DataTable和DataGridView的方式:

string pathOfXML = C:\\FIlePath;

DataTable dt = new DataTable("XML_Table");    

public void XML_Document()
{
  XML_FILE = XDocument.Load(pathOfXML);

  dt.Columns.Add("Name");
  dt.Columns.Add("Value");

  var rows = doc.Root.Descendants().Select(element => new
  {
   Name = element.Name,
   Value = element.Value,
  }); 

  rows.ToList().ForEach(i => dt.Rows.Add(i.Name, i.Value));

  dgv_XML.DataSource = dt;
}
然后,我在FormLoad()中调用此方法,以便它可以填充DataGridView

我试图通过按钮单击事件保存XML更改,代码如下:

 void btn_Save_Click(object sender, EventArgs e)
 {       
   dt.WriteXML(pathOfXML);

   Messagebox.Show("Save Successful!");
 } 
XML文件应该如下所示(非常基本):


价值
价值
价值
价值
价值
价值
价值
每当我试图保存它时,它就是这样的:

<Root>
    <XML_Table>
       <Name> Element Name </Name>
       <Value> Element Value </Value>
    </XML_Table>
    <XML_Table>
       <Name> Element Name </Name>
       <Value> Element Value </Value>
    </XML_Table>
    <XML_Table>
       <Name> Element Name </Name>
       <Value> Element Value </Value>
    </XML_Table>
    <XML_Table>
       <Name> Element Name </Name>
       <Value> Element Value </Value>
    </XML_Table>
    <XML_Table>
       <Name> Element Name </Name>
       <Value> Element Value </Value>
    </XML_Table>
    <XML_Table>
       <Name> Element Name </Name>
       <Value> Element Value </Value>
    </XML_Table>
    <XML_Table>
       <Name> Element Name </Name>
       <Value> Element Value </Value>
    </XML_Table>
</Root>

元素名
元素值
元素名
元素值
元素名
元素值
元素名
元素值
元素名
元素值
元素名
元素值
元素名
元素值

这会编辑值并保存它们,但它会在每个元素周围放置“XML_表”,我只想阻止“XML_表”的发生。

无需重新发明轮子。只需使用
DataTable.WriteXml
DataTable.ReadXml
方法分别进行写入和读取

你的最终目标是什么

如果要减小文件大小,请将列映射设置为属性而不是元素。还要指定表的短名称

var dt = new DataTable("dt"); // short table name

// mapping to attribute
dt.Columns.Add("Name").ColumnMapping = MappingType.Attribute;
dt.Columns.Add("Value").ColumnMapping = MappingType.Attribute;

dt.Rows.Add("name1", "value1");
dt.Rows.Add("name2", "value2");

dt.WriteXml("test.xml");
这将产生以下结果

<?xml version="1.0" standalone="yes"?>
<DocumentElement>
  <dt Name="name1" Value="value1" />
  <dt Name="name2" Value="value2" />
</DocumentElement>

我最终创建了动态标签来保存元素,并创建了文本框来保存值。然后我创建了一个for循环,这样我就可以得到递增的“I”。然后,我在for循环中放置了一个foreach循环,这样我就可以遍历每个元素,并用数组现在保存的值替换这些元素中的值

int lblpositionX = 17;
int lblpositionY = 39;
int increment = 0;
string[] arr1 = {};

foreach (XElement Name in XDocumentName.Root.Descendants())
{
   Label lbl = new Label();
   lbl.Text = Name.ToString();
   lbl.Name = Name.ToString();
   lbl.Location = new Point(lblpositionX, lblpositionY);
   lblpositionY += 25;

   TextBox txt = new TextBox();
   txt.Text = Name.Value.ToString();
   txt.Name = "XML_Text" + increment;
   txt.Location = new Point(txtpositionX, txtpositionY);
   txtpositionY += 25;

   pnl_XML.Controls.Add(lbl);
   pnl_XML.Controls.Add(txt);
}

private void btn_Save_Click(object sender, EventArgs e)
{
   var textboxes = pnl_XML.Controls.OfType<TextBox>().Select(Control => Control.Text);
   arr1 = textboxes.ToArray();
   int textBox = textboxes.Count();

   for (int i = 0; i < textBox; i++)
   {
      foreach (XElement Name in XDocumentName.Descendants())
      {
         Name.Value = arr[i];
         i++
      }
      XDocumentName.Save(pathofXML);
      return;
   }
}
int-lblpositionX=17;
int-lblpositionY=39;
整数增量=0;
字符串[]arr1={};
foreach(XDocumentName.Root.subjections()中的XElement名称)
{
标签lbl=新标签();
lbl.Text=Name.ToString();
lbl.Name=Name.ToString();
lbl.位置=新点(lblpositionX,lblpositionY);
lblpositionY+=25;
TextBox txt=新的TextBox();
txt.Text=Name.Value.ToString();
txt.Name=“XML_Text”+增量;
txt.Location=新点(txtpositionX,txtpositionY);
txty+=25;
pnl_XML.Controls.Add(lbl);
pnl_XML.Controls.Add(txt);
}
私有无效btn\u保存\u单击(对象发送者,事件参数e)
{
var textboxs=pnl_XML.Controls.OfType().Select(Control=>Control.Text);
arr1=textboxs.ToArray();
int textBox=textboxs.Count();
对于(int i=0;i
DataTable dt定义了两次。移动到两个方法之外的公共空间,以便使用相同的“dt”实例。@jdweng眼光不错,但我仍然有相同的问题。向我们展示您想要的XML。编辑我的原始帖子以显示XML的布局以及XML的保存方式。这就是DataTable Write.XML()方法的工作方式。如果您想要一种不同的格式,您必须编写自己的代码来保存文件和读取文件。您在回答中提到要使用DataTable.ReadXml,但您在实际回答中没有使用它,您忘记了吗?我尝试使用它,但它没有正确加载到我的DataGridView中。columnMapping工作得很好,可以正确地放置我编辑的XML,但它仍然会将数据表的名称添加到行中。我需要省去这一点,以便在需要再次编辑时可以将XML文件正确加载到DataGridView中。当保存的文件加载到DataGridView中时,它只在“名称”列中显示DataTable名称,而不显示任何其他内容。@AnthonyScheel-遗漏-为什么?你的最终目标是什么?为什么要创建错误的xml格式,然后英勇地尝试读取它?这就是我得到的格式。如果我能让我的团队改变格式,我会的。我的最终目标是将该文件加载到datagridview或其他格式中,然后编辑XML,然后将XML保存回具有更新值的同一文件中。我在顶部发布的XML格式正是我所需要的,如果我不能用DataGridView和DataTable实现这一点,那么我必须找到另一种方法。更新后的答案仅显示第一行中的第一个元素和值,而不显示其他内容。
public partial class Form1 : Form
{
    public Form1()
    {
        //InitializeComponent();
        path = "test.xml";

        dataGridView = new DataGridView { Parent = this, Dock = DockStyle.Top };
        buttonLoad = new Button { Parent = this, Top = 170, Text = "Load" };
        buttonSave = new Button { Parent = this, Top = 200, Text = "Save" };

        buttonLoad.Click += ButtonLoad_Click;
        buttonSave.Click += ButtonSave_Click;
    }

    DataGridView dataGridView;
    Button buttonSave;
    Button buttonLoad;

    string path;
    DataTable dataTable;
    DataSet dataSet;

    private void ButtonLoad_Click(object sender, EventArgs e)
    {
        dataSet = new DataSet("Root");

        if (File.Exists(path))
        {
            dataSet.ReadXml(path, XmlReadMode.InferSchema);
            dataTable = dataSet.Tables[0];
        }
        else
        {
            dataTable = new DataTable("dt");

            dataTable.Columns.Add("Name").ColumnMapping = MappingType.Attribute;
            dataTable.Columns.Add("Value").ColumnMapping = MappingType.Attribute;

            dataTable.Rows.Add("name1", "value1");
            dataTable.Rows.Add("name2", "value2");

            dataSet.Tables.Add(dataTable);
        }
        dataGridView.DataSource = dataTable;
    }

    private void ButtonSave_Click(object sender, EventArgs e)
    {
        if (dataSet != null)
            dataSet.WriteXml(path);
    }
}
int lblpositionX = 17;
int lblpositionY = 39;
int increment = 0;
string[] arr1 = {};

foreach (XElement Name in XDocumentName.Root.Descendants())
{
   Label lbl = new Label();
   lbl.Text = Name.ToString();
   lbl.Name = Name.ToString();
   lbl.Location = new Point(lblpositionX, lblpositionY);
   lblpositionY += 25;

   TextBox txt = new TextBox();
   txt.Text = Name.Value.ToString();
   txt.Name = "XML_Text" + increment;
   txt.Location = new Point(txtpositionX, txtpositionY);
   txtpositionY += 25;

   pnl_XML.Controls.Add(lbl);
   pnl_XML.Controls.Add(txt);
}

private void btn_Save_Click(object sender, EventArgs e)
{
   var textboxes = pnl_XML.Controls.OfType<TextBox>().Select(Control => Control.Text);
   arr1 = textboxes.ToArray();
   int textBox = textboxes.Count();

   for (int i = 0; i < textBox; i++)
   {
      foreach (XElement Name in XDocumentName.Descendants())
      {
         Name.Value = arr[i];
         i++
      }
      XDocumentName.Save(pathofXML);
      return;
   }
}