从XML文件填充列表框
我有一个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?
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);
}
}
我怎么能添加一个条件,例如,如果状态=通过然后显示它在例如listbox3? – user2962759
更新了我的答案检查。 – Sameer
在代码中,我应该把listBox2.Items.Clear();?所以如果我选择新的学生,我不希望项目被加载到列表框2 – user2962759
你用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作为属性移动,格式为
是的,但我需要从列表框1中选择的id,以及listBox1_SelectedIndexChanged中的代码如何? – user2962759
编辑答案回答你的评论 – mnieto
FillLisbox2呢? – user2962759
首先 - 我建议你使用Linq to Xml来解析xml(或者如果可能的话,使用Xml序列化)。第二 - 我建议创建类将举行学生和实验数据:
从XMLpublic 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;
我想下面将帮助您
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);
}
这是WinForm的? –
是的,它是2个列表框的winform – user2962759