1

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

1 に答える 1

2

コードはインデックスでアイテムを削除しようとしますが、インデックスXのアイテムを削除するたびに、インデックスX + 1のアイテムがインデックスXに移動されます。したがって、インデックス=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);
}

ただし、アイテムを削除するための推奨される方法は、インデックス値ではなくキー値で削除することです。

于 2012-05-30T10:28:58.217 に答える