如何从XML提取唯一Instructor ID填充ComboBox并存储选中信息?
解决XML中讲师ID去重及选中后获取信息的问题
问题背景
现有结构如下的XML文件:
<Sim> <Test ID="1" Description="test1" Date="17/01/2023"> <Instructor Num="1"> <Name>instructor1</Name> <Surname></Surname> <Rank></Rank> </Instructor> </Test> <Test ID="2" Description="test2" Date="16/01/2023"> <Instructor Num="22"> <Name>instructor22</Name> <Surname></Surname> <Rank></Rank> </Instructor> </Test> </Sim>
当前代码能获取所有讲师ID,但存在重复(同一讲师对应多个Test时会重复显示),同时需要选中ComboBox选项后,获取对应讲师的Name、Surname、Rank存入临时变量:
XmlDocument doc = new XmlDocument(); doc.Load(path); XmlNodeList insList = doc.SelectNodes("Sim/Test/Instructor"); foreach (XmlNode xn in insList) cBox_ins.Items.Add(xn.Attributes["Num"].Value);
解决方案
1. 定义讲师实体类
创建一个实体类封装讲师的所有信息,方便后续数据管理:
public class Instructor { public string Num { get; set; } public string Name { get; set; } public string Surname { get; set; } public string Rank { get; set; } }
2. 读取XML并去重,绑定到ComboBox
使用LINQ实现去重,同时将完整的讲师对象存入集合,绑定到ComboBox:
XmlDocument doc = new XmlDocument(); doc.Load(path); // 提取讲师信息并按Num去重 var instructors = doc.SelectNodes("Sim/Test/Instructor") .Cast<XmlNode>() .Select(xn => new Instructor { Num = xn.Attributes["Num"].Value, Name = xn.SelectSingleNode("Name").InnerText, Surname = xn.SelectSingleNode("Surname").InnerText, Rank = xn.SelectSingleNode("Rank").InnerText }) .GroupBy(ins => ins.Num) .Select(g => g.First()) .ToList(); // 配置ComboBox的显示与数据源 cBox_ins.DisplayMember = "Num"; cBox_ins.ValueMember = "Num"; cBox_ins.DataSource = instructors;
3. 选中选项后获取讲师信息
给ComboBox添加SelectedIndexChanged事件,在事件中提取选中讲师的信息:
private void cBox_ins_SelectedIndexChanged(object sender, EventArgs e) { if (cBox_ins.SelectedItem is Instructor selectedIns) { // 将信息存入临时变量 string tempName = selectedIns.Name; string tempSurname = selectedIns.Surname; string tempRank = selectedIns.Rank; // 可根据需求使用这些变量,比如赋值到其他控件或进行业务处理 } }
关键说明
- 实体类的使用避免了零散的字符串操作,代码更易维护
- 通过
GroupBy按Num去重,确保每个讲师ID仅显示一次 - 绑定完整数据源后,选中时直接获取讲师对象,无需重复查询XML
内容的提问来源于stack exchange,提问作者dositelu
相关产品推荐
相关产品推荐

