Комбинированный список с несколькими значениями

У меня есть такие данные...

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++ данных, поэтому я думаю, что это пустая трата процесса

Любая идея??

нота:примерэто просто пример формы, я не знаю, как кодировать, я просто делаю дизайн
будет полезно, если вы дадите мне реализацию combobox, а не cmd

3 ответа

Вы можете сгруппировать данные, прежде чем помещать их в 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. Кроме того, вы можете установить значение элемента "Этажи", чтобы использовать свойство SelectedValue.
Кроме того, вы устанавливаете элемент отображения на "Имя", чтобы ComboBox отображал имя.
Стоит отметить, что при группировании вы теряете идентификатор записей. Если в этом случае это важная информация, вам нужно настроить оператор группировки таким образом, чтобы он не только брал слово, но и идентификатор в элементах группы. Если идентификатор совпадает с именем магазина (что не так в ваших примерах данных), вы можете добавить свойство Id в класс MyGroupedData.

Вы хотите, чтобы было легко получить данные в выбранных элементах? Я предпочитаю заполнять данные специальным типом, чтобы получать данные непосредственно из выбранных элементов. поскольку 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);
    }
}

Затем вы можете заполнить данные в поле со специальным типом:

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

вот мой результат:результат шоу

.NET имеет возможность принимать LINQ Results, Lists, DataSets и т. Д. В свойстве DataSource. Вы могли бы сделать что-то вроде этого:

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

Я надеюсь, что это должно быть полезно для вашего запроса

Другие вопросы по тегам