2012-05-30 117 views
1

我使用XML文件來存儲和顯示ListBox上的內容。從列表框中刪除多個項目; XML中的更新

這是一個示例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)並刪除它們。

我的問題是,最好是展示而不是解釋;

選定的項目 -

Selected Items

按下Del鍵後 - XML文件的

Deleted Items

內容是相同的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); 
      } 
     } 
    } 
} 

回答

2

您的代碼改掉通過索引中刪除項目,但每個wnen你用食指X索引中刪除一個項目,該項目時間X + 1將被移動到索引十 所以每次當你與指數= 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); 
} 

但是,刪除項目的優先方式是通過鍵值而不是索引值刪除

+0

謝謝:)它似乎現在正在工作。 你能解釋一下哪裏出了問題......即爲什麼演員需要? 該方法是否適用於大型XML文件? – vs2010noob

+0

我已將解釋添加到答案中。 Cast <>不需要花錢,但它需要將Enumerable轉換爲Linq需要的可枚舉對象