组合框多个值成员单个显示成员c#

时间:2013-12-22 07:53:10

标签: c# combobox valuemember

我有这样的数据......

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 ++数据,所以我认为这是浪费流程

任何想法??

注意: example 这只是样本表格,我不知道如何编码,我只是做设计 如果你给我实现组合框而不是cmd

,那将会很有帮助

3 个答案:

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

这是我的结果: result show

答案 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";

我希望这对你的提问有用