首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从XML-file中填充列表框

从XML-file中填充列表框
EN

Stack Overflow用户
提问于 2014-02-05 12:11:40
回答 4查看 3.3K关注 0票数 0

我有一个XML文件和一个显示文件数据的ListBox。

XML文件是:

代码语言:javascript
复制
<students>
  <student>
    <id>1</id>
    <data>
      <subject name="Geopraphy" status="passed" />
      <subject name="History" status="passed" />
    </data>
  <student>
<students>

我想在listbox1中显示的是学生的id,如果被选中,我希望在另一个ListBox (listbox2)中显示该学生的所有主题。这是codeI到目前为止拥有的:

代码语言:javascript
复制
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?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-02-05 12:44:32

代码语言:javascript
复制
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);
    }
}
票数 1
EN

Stack Overflow用户

发布于 2014-02-05 12:21:38

首先,我建议您使用Linq到Xml来解析xml (如果可能的话,也可以使用Xml序列化)。第二,我建议创建一个包含学生和学科数据的班级:

代码语言:javascript
复制
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
}

然后解析来自xml的学生,并将他们映射到UI,而不是使用UI中的xml:

代码语言:javascript
复制
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();

然后,您可以将学生绑定到列表框:

代码语言:javascript
复制
 listBox1.DisplayMember = "Id";
 listBox1.DataSource = students;

并在选定的学生更改时,在listbox2中显示主题:

代码语言:javascript
复制
 listBox2.DisplayMember = "Name";
 listBox2.DataSource = selectedStudent.Subjects;
票数 2
EN

Stack Overflow用户

发布于 2014-02-05 12:19:29

您试过xpath吗?

代码语言:javascript
复制
/students/student[@id=1]/data/subject

其中1是在listbox1中选择的值。

您可以在http://msdn.microsoft.com/en-us/library/d271ytdx(v=vs.110).aspx中看到一个示例

编辑:添加了处理的listbox1_selectedIndex事件

代码语言:javascript
复制
    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作为表单中的属性移动

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21576929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档