一行中包含多个变量的组合框,保存所选内容

本文关键字:组合 保存 变量 一行 包含多 | 更新日期: 2023-09-27 18:00:24

我正在获取XML,过滤并将其放入一个组合框中,我的问题是获取所选的组合框条目,并保存每个单独的部分。以下是我使用的一些示例XML。

<SolutionString>  
    <Solutions>
        <Solution>
          <ID>1</ID>
          <Property>
            <Name>DriverSheave</Name>
            <Value>1VP34</Value>
          </Property>
          <Property>
            <Name>DriverBushing</Name>
            <Value>
            </Value>
          </Property>
          <Property>
            <Name>DrivenSheave</Name>
            <Value>AK49</Value>
          </Property>
          <Property>
            <Name>DrivenBushing</Name>
            <Value>
            </Value>
          </Property>
        </Solution>
        <Solution>
          <ID>2</ID>

等等(ID 2、ID 3等等)。之后,我将这些XML结果粘贴到我的组合框中,如下所示。

XmlDocument doc1 = new XmlDocument();
doc1.LoadXml(XmlString.ToString());
PTS.Library.VbeltDriveLibrary.Configurator Configurator = new PTS.Library.VbeltDriveLibrary.Configurator(doc1);
if (Configurator.SolveAndValidate())
{
    var solutions = Configurator.Results.ToXDocument();
    int i = 0;
    var indexesToChoose = new List<int> { 9, 8, 4, 5, 0, 2, 7, 6 };
    var cat = solutions
        .Descendants("Solution")
        .Select(x => new
        {
            ID = (string)x.Element("ID"),
            Properties = x.Elements("Property").Select(p => new
            {
                Name = (string) p.Element("Name"),
                Value = (string) p.Element("Value"),
                idx = (i < 11 ? i++ : i = 0)
            })
            .Where(y => indexesToChoose.Contains(y.idx))
            .OrderBy(z => indexesToChoose.FindIndex(p => p == z.idx))
            .ToList()
        });
    var items = cat
        .Select(s => new
        {
            ID = s.ID,
            Text = string.Format("{0}. {1}", s.ID,
            string.Join(", ", s.Properties
                               .Select(p => string.Format("{0} = {1}",
                                   p.Name,
                                   p.Value ?? "(null)"))))
        }).ToArray();
    comboBox1.DisplayMember = "Text";
    comboBox1.ValueMember = "ID";
    comboBox1.Items.AddRange(items);

最后,我想能够接受这个选择,(这是组合框中选择的项目)

  1. 成本=1072.93,实际传动轴速度=900/1073,皮带=B84,皮带数量=5,传动带轮=5MVP70B84P,注释2=此传动的正确张力(1.31磅应使皮带偏转0.48英寸)将具有30磅的"运行"轮毂负载,传动轴垂荡=5MVB70R,实际服务系数=40.63,实际中心距离=30.8

并将每个片段过滤成一个变量,例如

string ActualCenterDistance = 30.8

很明显,我可以用一个简单的combobox.selectedText轻松地将整个选择放入一个字符串中,但将每个片段放入单独的字符串(或任何其他var)是我的问题。

一行中包含多个变量的组合框,保存所选内容

这对我来说是个糟糕的设计。

考虑不在此处使用匿名类型:

.Select(x => new
            {
                ID = (string)x.Element("ID"),
                Properties = x.Elements("Property").Select(p => new

只需创建您自己的类的实例,它可以是:

public class MyItem
{
    public string ID;
    public List<Tuple<string, string>> Properties;
    public string GetProperty(string name)
    {
        if (Properties == null)
            return null;
        var item = Properties.FirstOrDefault(x => x.Item1 == name);
        return item == null ? null : item.Item2;
    }
    public override string ToString()
    {
        return string.Join(", ", Properties
            .Select(p => string.Format("{0} = {1}",
                p.Item1,
                p.Item2 ?? "(null)")));
    }
}

在这种情况下(因为我已经将属性的串联名称/值的逻辑转移到MyItem类的ToString方法重写中),您可以用类型为MyItem的项填充组合框,您将能够轻松地访问所有数据,如:

var item = comboBox1.SelectedItem as MyItem;
string x = item.GetProperty("DriverSheave");

要对代码进行的更改:

var items = solutions.Descendants("Solution")
    .Select(x => new MyItem
    {
        ID = (string)x.Element("ID"),
        Properties = x.Elements("Property").Select(p => new
        {
            Name = (string)p.Element("Name"),
            Value = (string)p.Element("Value"),
            idx = (i < 11 ? i++ : i = 0)
        })
        .Where(y => indexesToChoose.Contains(y.idx))
        .OrderBy(z => indexesToChoose.FindIndex(p => p == z.idx))
        .Select(z => new Tuple<string, string>(z.Name, z.Value))
        .ToList()
    }).ToArray();

comboBox1.DisplayMember = "Text";
comboBox1.ValueMember = "ID";
comboBox1.Items.AddRange(items);

注意:对于组合框,有一些自定义类作为Item非常重要,因为在使用匿名类型的情况下,从combobox.SelectedItem获取对象时将无法访问其字段。