2014-02-05 146 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); 
     }