一行中包含多个变量的组合框,保存所选内容
本文关键字:组合 保存 变量 一行 包含多 | 更新日期: 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);
最后,我想能够接受这个选择,(这是组合框中选择的项目)
- 成本=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
获取对象时将无法访问其字段。