我有一个由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?
谢谢!
答案 0 :(得分:0)
数据网格绑定到其数据源。在一个简单的元素列表示例中,对网格进行更改(例如在复选框中打勾)将更新其仍引用的基础数据。
我认为使用XML数据源无法执行相同的操作。
只要您的代码正确删除了必需的XML元素,您就可能不得不再次将文件重新绑定到网格-我不确定这是否就是您的“ ReadXmlData();”行。会。
要从诸如ID之类的单元格获取值,您需要使用ToolsDataGridView.SelectedRows [0] .Cells [...]-按名称或位置,然后获取将其转换为正确类型的值-在您的情况下,它将是字符串而不是整数,因为数据来自XML,没有模式或其他定义可调用
答案 1 :(得分:0)
嗨,好几分-
代码从xml中删除了所选元素,但放置了一个 到它的位置。有人可以帮助我,我该怎么办 错误吗?
代码没有问题,这是从XML数组中删除元素时的预期行为。如果您确实要删除这些空元素,则在保存XML之前先删除它们,如下所示,然后将XML再次绑定到grid-
xmlDoc.Descendants().Where(d => d.IsEmpty || String.IsNullOrWhiteSpace(d.Value)).Remove();
您可以阅读有关删除空元素here-
的更多信息当我删除元素时,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);