2014-02-05 182 views
0

我有一個XML文件和一個顯示文件數據的ListBox。從XML文件填充列表框

XML文件是:

<students> 
    <student> 
    <id>1</id> 
    <data> 
     <subject name="Geopraphy" status="passed" /> 
     <subject name="History" status="passed" /> 
    </data> 
    <student> 
<students> 

我理想中爲ListBox,顯示的是學生的ID,如果選擇了,我想在另一個列表框(listbox2)中顯示的所有受試者那個學生。這是我到目前爲止的代碼:

XmlDocument xm = new XmlDocument(); 
string list = "//id"; 

xm.Load("data.xml"); 
XmlNodeList Xn = xm.SelectNodes(list); 

foreach (XmlNode xNode in Xn) 
{ 
    listBox1.Items.Add(xNode.InnerText); 
} 

如何填寫listbox2?

+0

這是WinForm的? –

+0

是的,它是2個列表框的winform – user2962759

回答

1
private void listBox1_SelectedIndexChanged(object sender, EventArgs e) 
{  
    XmlNode nodes = xDoc.SelectSingleNode(String.Format("/students/student[id={0}]/data", listBox1.SelectedItem)); 
    foreach (XmlNode node in nodes.ChildNodes) 
    { 
     if (node.Attributes["status"].Value == "passed") 
      listBox2.Items.Add(node.Attributes["name"].Value); 
    } 
} 
+0

我怎麼能添加一個條件,例如,如果狀態=通過然後顯示它在例如listbox3? – user2962759

+0

更新了我的答案檢查。 – Sameer

+0

在代碼中,我應該把listBox2.Items.Clear();?所以如果我選擇新的學生,我不希望項目被加載到列表框2 – user2962759

1

你用xpath試過嗎?

/students/student[@id=1]/data/subject 

其中1是在ListBox1中選擇的值

你可以看到編輯的http://msdn.microsoft.com/en-us/library/d271ytdx(v=vs.110).aspx

一個例子:新增listbox1_selectedIndex事件處理

private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { 
     if (listBox1.SelectedIndex != -1) { 
      string path = String.Concat("/students/student[@id=", listBox1.SelectedItem, "]/data/subject"); 
      FillListbox2(xm, path); 
     } 
    } 

在你的代碼會需要將XDocument作爲屬性移動,格式爲

+0

是的,但我需要從列表框1中選擇的id,以及listBox1_SelectedIndexChanged中的代碼如何? – user2962759

+0

編輯答案回答你的評論 – mnieto

+0

FillLisbox2呢? – user2962759

2

首先 - 我建議你使用Linq to Xml來解析xml(或者如果可能的話,使用Xml序列化)。第二 - 我建議創建類將舉行學生和實驗數據:

從XML
public class Student 
{ 
    public int Id { get; set; } 
    public List<Subject> Subjects { get; set; } 
} 

public class Subject 
{ 
    public string Name { get; set; } 
    public string Status { get; set; } // enum or boolean is better 
} 

然後解析學生並將其映射到用戶界面,而不是從UI使用XML:

var xdoc = XDocument.Load("students.xml"); 
var students = xdoc.Root.Elements("student") 
        .Select(st => new Student { 
         Id = (int)st.Element("id"), 
         Subjects = st.Element("data") 
            .Elements("subject") 
            .Select(s => new Subject { 
             Name = (string)s.Attribute("name"), 
             Status = (string)s.Attribute("status") 
            }).ToList() 
        }).ToList(); 

然後你可以結合學生列表框:

listBox1.DisplayMember = "Id"; 
listBox1.DataSource = students; 

和顯示科目listbox2時選擇的學生改變:

listBox2.DisplayMember = "Name"; 
listBox2.DataSource = selectedStudent.Subjects; 
0

我想下面將幫助您

 XmlDocument xm = new XmlDocument(); 
     string list = "//data"; 
     xm.Load("XMLFile1.xml"); 
     XmlNodeList Xn = xm.SelectNodes(list); 
     foreach (XmlNode xNode in Xn) 
     { 
      listBox2.Items.Add(xNode.ChildNodes[0].Name.InnerText); 
     }