从xml文件中删除选定的datagridview元素

时间:2018-09-24 09:33:41

标签: c# xml datagridview

我有一个由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中删除了选定的元素,但将<ToolClass />放置在其位置。有人可以帮助我,我该怎么办?

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

谢谢!

2 个答案:

答案 0 :(得分:0)

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

我认为使用XML数据源无法执行相同的操作。

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

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

答案 1 :(得分:0)

嗨,好几分-

  1.   

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

代码没有问题,这是从XML数组中删除元素时的预期行为。如果您确实要删除这些空元素,则在保存XML之前先删除它们,如下所示,然后将XML再次绑定到grid-

 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);