Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# xml来填充组合框并过滤结果_C#_Xml_Visual Studio - Fatal编程技术网

C# xml来填充组合框并过滤结果

C# xml来填充组合框并过滤结果,c#,xml,visual-studio,C#,Xml,Visual Studio,我有一个xml文件,看起来像这样 <?xml version="1.0" encoding="utf-8" ?> <Data> <Family> <ID>1</ID> <Head_Model>FOV</Head_Model> <Version>7</Version> <Version>15</Version> <Ve

我有一个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>
问题是如何过滤和填充框2。我不知道如何用值填充框2,因为我只显示第一个标记,并且它不会随着开关事件而改变

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;

   }
}

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

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; }
}

当然,您可以为bs1、bs2、bs3和数据创建类字段,而不是局部变量。

我会将xml解析为您所需的数据结构,并使用这些数据结构,而不是不断返回xml。这很有效。我可以再问一件事吗,使用您的方法如果use为null,我需要在运行时将数据添加到xml中,如何禁用combobox3?我将如何使用您的解决方案执行此操作?这将在使用datatableview的单独编辑页面上进行components@RhysClarke-comboBox3.DataSource=null?是的,我意识到我是个白痴:D投了赞成票,并被标记为解决方案!
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; }
}
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;