我有这样的数据......
id->name->floor
1->store1->1
2->store2->1
3->store2->2
4->store2->3
5->store3->2
我希望将其添加到combobox
中,并显示如下...
store1
store2
store3
当我选择store2时,我想得到valuemember = 2, 3, 4
我认为一个逻辑(我还没有尝试代码)...
当我选择store2之后我得到valuemember = 2
之后我会在database
检查id
表中是否有name
。但我有500 ++数据,所以我认为这是浪费流程
任何想法??
注意: 这只是样本表格,我不知道如何编码,我只是做设计 如果你给我实现组合框而不是cmd
,那将会很有帮助答案 0 :(得分:1)
您是否希望轻松检索所选项目中的数据?我更喜欢使用其特殊类型填充数据,以便可以直接从选择的项目中获取数据。因为Combox.Item.Add()
函数需要对象类型的参数,所以,我建议你可以先用新类型定义数据,如下所示:
/// <summary>
/// my own data define
/// </summary>
public class MyFloor
{
public int ID { get; set; }
public string Name { get; set; }
public string Floor { get; set; }
//very important, the result will be displayed in the combox
public override string ToString()
{
return string.Format("{0}->{1}->{2}", ID, Name, Floor);
}
}
然后,您可以将数据填入特殊类型的combox中:
void FillData()
{
//load data from txt or database
List<MyFloor> floorList = new List<MyFloor>(){
new MyFloor{ID=1, Name="store1", Floor="1"},
new MyFloor{ID=2, Name="store2", Floor="1"},
new MyFloor{ID=3, Name="store2", Floor="2"},
new MyFloor{ID=4, Name="store2", Floor="3"},
new MyFloor{ID=5, Name="store3", Floor="2"}
};
//fill into combox
foreach (MyFloor floor in floorList)
{
this.comboBox1.Items.Add(floor);
}
}
最后,您可以直接获取数据:
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
//retrieve data from selected item as MyFloor object
MyFloor floor = this.comboBox1.SelectedItem as MyFloor;
//show the selected data object
if (floor != null)
{
txtID.Text = floor.ID.ToString();
txtName.Text = floor.Name;
txtFloor.Text = floor.Floor;
}
}
这是我的结果:
答案 1 :(得分:0)
您可以在将数据放入ComboBox之前对数据进行分组。我把一个小的sample放在一起(按照链接运行或更改它):
using System;
using System.Collections.Generic;
using System.Linq;
public class MyData
{
public int Id { get; set; }
public string Name { get; set; }
public int Floor { get; set; }
}
public class MyGroupedData
{
public string Name { get; set; }
public IEnumerable<int> Floors { get; set; }
}
public class Test
{
public static void Main()
{
MyData[] data = {
new MyData() { Id = 1, Name = "Store1", Floor = 1 },
new MyData() { Id = 2, Name = "Store2", Floor = 1 },
new MyData() { Id = 3, Name = "Store2", Floor = 2 },
new MyData() { Id = 4, Name = "Store2", Floor = 3 },
new MyData() { Id = 5, Name = "Store3", Floor = 2 },
};
var groupedData = from x in data group x by x.Name into grp
select new MyGroupedData() { Name = grp.Key, Floors = grp.Select(y => y.Floor) };
foreach(var g in groupedData)
Console.WriteLine("{0} -> {1}", g.Name, string.Join(", ", g.Floors.Select(x => x.ToString()).ToArray()));
}
}
虽然此示例是控制台应用程序,但我希望它显示解决问题所需的主要步骤。将ComboBox绑定到分组操作的结果,并使用SelectedItem属性访问所选项。此外,您可以将值成员设置为“Floors”以使用SelectedValue属性 此外,将显示成员设置为“名称”,以便ComboBox显示名称 需要注意的一点是,在分组时,您会丢失记录的ID。如果在这种情况下这是一个有价值的信息,您需要调整分组语句,以便它不仅可以发言,而且还可以将ID作为组项目。如果商店名称的id相同(在示例数据中不是这种情况),则可以向MyGroupedData类添加Id属性。
答案 2 :(得分:0)
.NET能够接受DataSource属性中的LINQ结果,列表,数据集等。 你可以这样做:
comboBox.DataSource = DataSetObject;
comboBox.DisplayMember = "DataTableFromDataSetObject.nameColumn";
comboBox.ValueMember = "DataTableFromDataSetObject.idColumn";
/*-------OR LINQ OBJECT-----------*/
comboBox.DataSource = (from dt.Select() in row
select new {name = row["nameColumn"],id = row["idColumn"]}).ToList();
comboBox.DisplayMember = "nameColumn";
comboBox.ValueMember = "idColumn";
我希望这对你的提问有用