【问题标题】:Remove selected datagridview element from xml file从 xml 文件中删除选定的 datagridview 元素
【发布时间】:2018-09-24 09:33:40
【问题描述】:

我有一个由 C# 程序创建的 xml 文件(data/tools.xml),如下所示:

<?xml version="1.0"?>
<ArrayOfToolClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <ToolClass>
    <ToolID>1</ToolID>
    <ToolName>Multiflute Endmill</ToolName>
    <ToolDia>8</ToolDia>
    <ToolTooth>4</ToolTooth>
    <ToolApmxs>32</ToolApmxs>
    <ToolCuttingSpeed>200</ToolCuttingSpeed>
    <ToolFeedPerTooth>0.05</ToolFeedPerTooth>
    <ToolAe>4</ToolAe>
    <ToolAp>8</ToolAp>
    <ToolManufacturer>SECO</ToolManufacturer>
    <ToolSerial>FHAKJSH</ToolSerial>
  </ToolClass>
  <ToolClass>
    <ToolID>2</ToolID>
    <ToolName>Multiflute Endmill</ToolName>
    <ToolDia>4</ToolDia>
    <ToolTooth>4</ToolTooth>
    <ToolApmxs>25</ToolApmxs>
    <ToolCuttingSpeed>200</ToolCuttingSpeed>
    <ToolFeedPerTooth>0.03</ToolFeedPerTooth>
    <ToolAe>2</ToolAe>
    <ToolAp>4</ToolAp>
    <ToolManufacturer>SECO</ToolManufacturer>
    <ToolSerial>SJKHDKJ</ToolSerial>
  </ToolClass>
  <ToolClass>
    <ToolID>3</ToolID>
    <ToolName>Multiflute Endmill</ToolName>
    <ToolDia>20</ToolDia>
    <ToolTooth>4</ToolTooth>
    <ToolApmxs>38</ToolApmxs>
    <ToolCuttingSpeed>45</ToolCuttingSpeed>
    <ToolFeedPerTooth>0.02</ToolFeedPerTooth>
    <ToolAe>2</ToolAe>
    <ToolAp>20</ToolAp>
    <ToolManufacturer>SECO</ToolManufacturer>
    <ToolSerial>SJKHDKJ</ToolSerial>
  </ToolClass>
</ArrayOfToolClass>

我在 Windows 窗体应用程序中将此文件加载到 datagridview。 Program image 1 我想从 datagridview 中选择的 xml 文件中删除项目。 我试过这段代码:

 private void toolStripMenuItem1_Click(object sender, EventArgs e)
    {
        if (MessageBox.Show("Biztosan törlöd a szerszámot?", "Törlés", MessageBoxButtons.YesNo) == DialogResult.Yes)
        {
            int id = (ToolsDataGridView.SelectedRows[0].Index) + 1;
            Console.WriteLine(id);

            XDocument xmlDoc = XDocument.Load(@"data\tools.xml");
            var elementsToDelete = from ele in xmlDoc.Descendants("ToolClass")
                                   where ele != null && ele.Element("ToolID").Value == id.ToString()
                                   select ele;

            foreach (var x in elementsToDelete)
            {
                x.RemoveAll();


            }

            xmlDoc.Save(@"data\tools.xml");
            ReadXmlData();
        }

代码从 xml 中删除选定的元素,但在其位置放置 &lt;ToolClass /&gt;。谁能帮帮我,我做错了什么?

代码的另一个问题: 当我删除一个元素时,ToolID 与 datagridview 选择的行索引不匹配。如何根据所选行获取正确的 ToolID?

谢谢!

【问题讨论】:

    标签: c# xml datagridview


    【解决方案1】:

    几个点 -

    1. 代码从 xml 中删除选定的元素,但放置一个 到它的位置。有人可以帮我吗,我该怎么办 错了吗?

    代码没有任何问题,这是您从 XML 数组中删除元素时的预期行为。如果您真的想删除这些空元素,请在保存 XML 之前删除它们。在您的情况下,以下代码将有所帮助:

     xmlDoc.Descendants().Where(d => d.IsEmpty || String.IsNullOrWhiteSpace(d.Value)).Remove();
    

    Here 你可以阅读更多关于删除空元素的内容。

    1. 当我删除一个元素时,ToolID 与 datagridview 选定的行索引。如何获得正确的 ToolID 基于所选行?

    如果所选 ToolID 采用增量方式,则您拥有的代码可以很好地删除记录,例如,在您的示例 XML 中,ToolID 是 1,2 和 3,如果您选择第一行,那么它将在将 1 添加到所选索引时删除该行,否则,如果您的 ToolID 与屏幕截图中的数据相同(例如多个记录的类似 ToolID),那么您必须更改以下逻辑,该逻辑将删除具有该 ToolID 的所有记录-

    int id = (ToolsDataGridView.SelectedRows[0].Index) + 1;
    

    致,

    int id = Convert.ToInt32((dataGridView1.SelectedRows[0].Cells["ToolID"]).Value);
    

    【讨论】:

    • 嗨!感谢您的回答。你的建议是有效的。我有一个小错误:当我从 xml 文件中删除最后一个元素时,然后删除文件的完整内容,包括标题。删除最后一个元素后,我希望看到: w3.org/2001/XMLSchema-instance" xmlns:xsd="w3.org/2001/XMLSchema" >
    • 如果要保留空数组,则将行更改为“ xmlDoc.Descendants().Where(d => d.IsEmpty).Remove();”,还要确保检查重新绑定空数组时出现空表条件!
    【解决方案2】:

    数据网格绑定到其数据源。在元素列表的一个简单示例中,在网格中进行更改(例如勾选复选框)将更新它仍然引用的基础数据。

    我认为不可能使用 XML 数据源执行相同的操作。

    只要您的代码正确删除了所需的 XML 元素,您就可能不得不再次将文件重新绑定到网格 - 我不确定这是否是您的“ReadXmlData();”行可以。

    要从单元格中获取值,例如 ID,您需要使用 ToolsDataGridView.SelectedRows[0].Cells[...] - 按名称或位置,然后获取您转换为正确类型的值- 在你的情况下,它将是一个字符串而不是一个整数,因为数据来自 XML,没有架构或其他定义可以调用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-09
      相关资源
      最近更新 更多