我使用XML文件来存储和显示ListBox上的内容。
以下是XML文件示例;
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Root>
<Entry>
<Details>0</Details>
</Entry>
<Entry>
<Details>1</Details>
</Entry>
<Entry>
<Details>2</Details>
</Entry>
<Entry>
<Details>3</Details>
</Entry>
<Entry>
<Details>4</Details>
</Entry>
<Entry>
<Details>5</Details>
</Entry>
<Entry>
<Details>6</Details>
</Entry>
</Root>
用户可以选择ListBox上的值(选择模式为MultiExtended)并删除它们。
我的问题是,显示比解释更好;
所选项目 -
按Del键后 -
XML文件的内容与ListBox相同。
当我选择全部并按删除时,结果更加奇怪。
我做错了吗?
如何获取多个项目的索引并正确处理它们?
这是我的代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using System.Windows.Forms;
namespace XML_ListBox
{
public partial class Form1 : Form
{
string path = "Test.xml";
public Form1()
{
InitializeComponent();
LoadFile();
}
private void LoadFile()
{
XDocument xdoc = XDocument.Load(path);
foreach (var el in xdoc.Root.Elements())
{
listBox1.Items.Add(el.Element("Details").Value);
}
}
private void OnDelete(object sender, KeyEventArgs e)
{
XElement root = XElement.Load(path);
if (e.KeyCode == Keys.Delete)
{
foreach (Object index in listBox1.SelectedIndices)
{
root.Elements("Entry").ElementAt((int)index).Remove();
listBox1.Items.RemoveAt((int)index);
}
root.Save(path);
}
}
}
}
答案 0 :(得分:2)
您的代码尝试按索引删除项目,但每次删除索引为X的项目时,索引为X + 1的项目将移动到索引X. 因此,每当您删除Index = 0的项目时,索引为5的项目将变为索引4。
您可以尝试对索引进行排序:
if (e.KeyCode == Keys.Delete)
{
foreach (int index in listBox1.SelectedIndices.Cast<int>().OrderByDescending(i=>i))
{
root.Elements("Entry").ElementAt(index).Remove();
listBox1.Items.RemoveAt(index);
}
root.Save(path);
}
但删除项目的优先方式是按键值而不是索引值
删除