【问题标题】:xml to populate combobox and filter the resultsxml 填充组合框并过滤结果
【发布时间】:2018-05-19 10:49:56
【问题描述】:

我有一个看起来像这样的 xml 文件;

<?xml version="1.0" encoding="utf-8" ?>
<Data>
  <Family>
    <ID>1</ID>
    <Head_Model>FOV</Head_Model>
    <Version>7</Version>
    <Version>15</Version>
    <Version>40</Version>
    <Version>80</Version>
    <Use>U</Use>
    <Use>M</Use>
  </Family>
  <Family>
    <ID>2</ID>
    <Head_Model>CSK</Head_Model>
    <Version>20</Version>
    <Version>40</Version>
  </Family>
  <Family>
    <ID>3</ID>
    <Head_Model>EX</Head_Model>
  </Family>
</Data>

在我的表单上,我有 3 个组合框,分别用于型号、版本和用途。

我需要用 xml 中的数据填充组合框,因此如果您选择“FOV”,那么只有该版本应显示在组合框 2 中,并在组合框 3 中显示。

我正在读取这样的 xml 以在加载时填充组合框一个;

public void LoadXML()
{

   using (XmlReader reader = XmlReader.Create(XmlLocation))
   {
      while (reader.Read())
      {
        if (reader.NodeType == XmlNodeType.Element)

            if (reader.Name == "ID")
            {
               reader.Read();
               string sID = reader.Value;
               string sHead_Model = string.Empty;

               if (reader.ReadToFollowing("Head_Model"))
               {
                  reader.Read();
                  sHead_Model = reader.Value;
               }


               if (!string.IsNullOrEmpty(sID) && sHead_Model != string.Empty)
                  lstItems.Add(new Item(sHead_Model, Convert.ToInt32(sID)));

            }
      }
   }

   comboBox1.DataSource = lstItems;
   comboBox1.DisplayMember = "Name";
   comboBox1.ValueMember = "Id";

}

问题是能够过滤和填充框 2 我无法弄清楚如何使用这些值填充它,因为我只显示了第一个 &lt;Value&gt; 标记,并且它不会随 switch 事件而改变。

private void comboBox1_SelectedValueChanged(object sender, EventArgs e)
{
   switch (comboBox1.Text)
   {
      case "FOV":

         using (XmlReader reader = XmlReader.Create(XmlLocation))
         {
            while (reader.Read())
            {
               if (reader.NodeType == XmlNodeType.Element)

                  if (reader.Name == "ID")
                  {
                     reader.Read();
                     string sID = reader.Value;
                     string sHead_Model = string.Empty;

                     if (reader.ReadToFollowing("Head_Model"))
                     {
                        reader.Read();
                        sHead_Model = reader.Value;
                        string sVersion = string.Empty;

                        if (reader.ReadToFollowing("Version"))
                        {
                           reader.Read();
                           sVersion = reader.Value;
                        }


                        if (!string.IsNullOrEmpty(sID) && sHead_Model != string.Empty && sVersion != string.Empty && sHead_Model == "FOV")
                           VersionsItems.Add(new Item(sVersion, Convert.ToInt32(sID)));
                     }
                  }
            }
         }

         comboBox2.DataSource = VersionsItems;
         comboBox2.DisplayMember = "Name";
         comboBox2.ValueMember = "Id";

         break;

      case "CSK":

         using (XmlReader reader = XmlReader.Create(XmlLocation))
         {
            while (reader.Read())
            {
               if (reader.NodeType == XmlNodeType.Element)

                  if (reader.Name == "ID")
                  {
                     reader.Read();
                     string sID = reader.Value;
                     string sHead_Model = string.Empty;

                     if (reader.ReadToFollowing("Head_Model"))
                     {
                        reader.Read();
                        sHead_Model = reader.Value;
                        string sVersion = string.Empty;

                        if (reader.ReadToFollowing("Version"))
                        {
                           reader.Read();
                           sVersion = reader.Value;
                        }


                        if (!string.IsNullOrEmpty(sID) && sHead_Model != string.Empty && sVersion != string.Empty && sHead_Model == "CSK")
                           VersionsItems.Add(new Item(sVersion, Convert.ToInt32(sID)));
                     }
                  }
            }
         }

         comboBox2.DataSource = VersionsItems;
         comboBox2.DisplayMember = "Name";
         comboBox2.ValueMember = "Id";

         break;

   }
}

【问题讨论】:

  • 我会将 xml 解析为您想要的数据结构并使用这些数据结构,而不是不断返回 xml。

标签: c# xml visual-studio


【解决方案1】:

让我们为您的数据创建模型。

public class Data
{
    [XmlElement("Family")]
    public List<Family> Families { get; set; }
}

public class Family
{
    [XmlElement("ID")]
    public int Id { get; set; }

    [XmlElement("Head_Model")]
    public string HeadModel { get; set; }

    [XmlElement("Version")]
    public List<int> Version { get; set; }

    [XmlElement("Use")]
    public List<string> Use { get; set; }
}

反序列化 xml 并用数据填充模型。
通过BindingSource将组合框绑定到数据。

Data data;
var xs = new XmlSerializer(typeof(Data));

using (var stream = new FileStream("test.xml", FileMode.Open))
{
    data = (Data)xs.Deserialize(stream);
}

var bs1 = new BindingSource();
bs1.DataSource = data;
bs1.DataMember = nameof(Data.Families);

comboBox1.DataSource = bs1;
comboBox1.DisplayMember = nameof(Family.HeadModel);
comboBox1.ValueMember = nameof(Family.Id);

var bs2 = new BindingSource();
bs2.DataSource = bs1;
bs2.DataMember = nameof(Family.Version);

comboBox2.DataSource = bs2;

var bs3 = new BindingSource();
bs3.DataSource = bs1;
bs3.DataMember = nameof(Family.Use);

comboBox3.DataSource = bs3;

当然,您可以为bs1bs2bs3data 创建类字段而不是局部变量。

【讨论】:

  • 这很好用我可以再问一件事吗使用您的解决方案(这将在使用 datatableview 组件的单独编辑页面上)
  • @RhysClarke - comboBox3.DataSource = null; ?
  • 是的,我意识到我是个白痴:D 赞成并标记为解决方案!
猜你喜欢
  • 1970-01-01
  • 2015-05-23
  • 2018-03-05
  • 1970-01-01
  • 2020-03-14
  • 1970-01-01
  • 1970-01-01
  • 2014-03-20
  • 1970-01-01
相关资源
最近更新 更多