выпадающий список с несколькими значениями одиночный элемент отображения С#

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

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


person Zenithxm    schedule 22.12.2013    source источник


Ответы (3)


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

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

person Scott Yang    schedule 22.12.2013

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

person Markus    schedule 22.12.2013

.NET имеет возможность принимать результаты LINQ, списки, наборы данных и т. д. в свойстве 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";

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

person pedritin    schedule 17.01.2014