0

我有这样的数据...

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

尚未尝试代码)... 但是我有 500++ 数据,所以我认为这是浪费过程
valuemember = 2databaseidname

任何想法??

注意: 例子 这只是示例表单,我不知道如何编码,我只是进行设计
,如果您给我实现组合框而不是 cmd,这将很有帮助

4

3 回答 3

1

您想轻松检索所选项目中的数据吗?我更喜欢用它的特殊类型填充数据,以便可以直接从选定的项目中获取数据。因为这个Combox.Item.Add()函数需要一个Object类型的参数,所以,我建议你可以先定义一个新类型的数据,像这样:

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

然后,您可以将数据填充到特殊类型的组合框中:

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

这是我的结果: 结果显示

于 2013-12-22T09:55:57.863 回答
1

您可以在将数据放入 ComboBox 之前对其进行分组。我整理了一个小样本(按照链接运行或更改它):

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 相同(在您的示例数据中不是这种情况),您可以将 Id 属性添加到 MyGroupedData 类。

于 2013-12-22T10:02:54.517 回答
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";

我希望这对您的询问有用

于 2014-01-17T19:16:07.730 回答