ComboBox: добавление текста и значения к элементу (без источника привязки) - PullRequest
180 голосов
/ 17 июня 2010

В C # WinApp, как я могу добавить текст и значение к элементам моего ComboBox?Я выполнил поиск и обычно в ответах используется «Привязка к источнику» ... но в моем случае у меня нет готового источника привязки в моей программе ... Как я могу сделать что-то вроде этого:

combo1.Item[1] = "DisplayText";
combo1.Item[1].Value = "useful Value"

Ответы [ 20 ]

3 голосов
/ 13 февраля 2017

Этот код можно использовать для вставки некоторых элементов в поле со списком с текстом и значением.

C #

private void ComboBox_SelectionChanged_1(object sender, SelectionChangedEventArgs e)
{
    combox.Items.Insert(0, "Copenhagen");
    combox.Items.Insert(1, "Tokyo");
    combox.Items.Insert(2, "Japan");
    combox.Items.Insert(0, "India");   
}

XAML

<ComboBox x:Name="combox" SelectionChanged="ComboBox_SelectionChanged_1"/>
3 голосов
/ 04 марта 2014

Пример использования DataTable:

DataTable dtblDataSource = new DataTable();
dtblDataSource.Columns.Add("DisplayMember");
dtblDataSource.Columns.Add("ValueMember");
dtblDataSource.Columns.Add("AdditionalInfo");

dtblDataSource.Rows.Add("Item 1", 1, "something useful 1");
dtblDataSource.Rows.Add("Item 2", 2, "something useful 2");
dtblDataSource.Rows.Add("Item 3", 3, "something useful 3");

combo1.Items.Clear();
combo1.DataSource = dtblDataSource;
combo1.DisplayMember = "DisplayMember";
combo1.ValueMember = "ValueMember";

   //Get additional info
   foreach (DataRowView drv in combo1.Items)
   {
         string strAdditionalInfo = drv["AdditionalInfo"].ToString();
   }

   //Get additional info for selected item
    string strAdditionalInfo = (combo1.SelectedItem as DataRowView)["AdditionalInfo"].ToString();

   //Get selected value
   string strSelectedValue = combo1.SelectedValue.ToString();
1 голос
/ 10 января 2013

В дополнение к ответу Адама Марковица, вот универсальный способ (относительно) простого задания значений ItemSource в комбинированном ящике равным enums, в то же время показывая атрибут «Описание» пользователю. (Вы могли бы подумать, что все захотят сделать это так, чтобы это был .NET один лайнер, но это не так, и это самый элегантный способ, который я нашел).

Сначала создайте этот простой класс для преобразования любого значения Enum в элемент ComboBox:

public class ComboEnumItem {
    public string Text { get; set; }
    public object Value { get; set; }

    public ComboEnumItem(Enum originalEnum)
    {
        this.Value = originalEnum;
        this.Text = this.ToString();
    }

    public string ToString()
    {
        FieldInfo field = Value.GetType().GetField(Value.ToString());
        DescriptionAttribute attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;
        return attribute == null ? Value.ToString() : attribute.Description;
    }
}

Во-вторых, в вашем обработчике событий OnLoad вы должны установить в качестве источника вашего поля со списком значение ComboEnumItems на основе каждого Enum в вашем типе Enum. Это может быть достигнуто с Linq. Затем просто установите DisplayMemberPath:

    void OnLoad(object sender, RoutedEventArgs e)
    {
        comboBoxUserReadable.ItemsSource = Enum.GetValues(typeof(EMyEnum))
                        .Cast<EMyEnum>()
                        .Select(v => new ComboEnumItem(v))
                        .ToList();

        comboBoxUserReadable.DisplayMemberPath = "Text";
        comboBoxUserReadable.SelectedValuePath= "Value";
    }

Теперь пользователь будет выбирать из списка ваших дружественных Descriptions, но он выберет значение enum, которое вы можете использовать в коде. Чтобы получить доступ к выбору пользователя в коде, comboBoxUserReadable.SelectedItem будет ComboEnumItem, а comboBoxUserReadable.SelectedValue будет EMyEnum.

1 голос
/ 26 февраля 2015

Вы можете использовать универсальный тип:

public class ComboBoxItem<T>
{
    private string Text { get; set; }
    public T Value { get; set; }

    public override string ToString()
    {
        return Text;
    }

    public ComboBoxItem(string text, T value)
    {
        Text = text;
        Value = value;
    }
}

Пример использования простого типа int:

private void Fill(ComboBox comboBox)
    {
        comboBox.Items.Clear();
        object[] list =
            {
                new ComboBoxItem<int>("Architekt", 1),
                new ComboBoxItem<int>("Bauträger", 2),
                new ComboBoxItem<int>("Fachbetrieb/Installateur", 3),
                new ComboBoxItem<int>("GC-Haus", 5),
                new ComboBoxItem<int>("Ingenieur-/Planungsbüro", 9),
                new ComboBoxItem<int>("Wowi", 17),
                new ComboBoxItem<int>("Endverbraucher", 19)
            };

        comboBox.Items.AddRange(list);
    }
0 голосов
/ 26 февраля 2018

Лучшее решение здесь;

Dictionary<int, string> userListDictionary = new Dictionary<int, string>();
        foreach (var user in users)
        {
            userListDictionary.Add(user.Id,user.Name);
        }

        cmbUser.DataSource = new BindingSource(userListDictionary, null);
        cmbUser.DisplayMember = "Value";
        cmbUser.ValueMember = "Key";

Получение данных

MessageBox.Show(cmbUser.SelectedValue.ToString());
0 голосов
/ 29 октября 2015

У меня была та же проблема: я добавил новое значение ComboBox, содержащее только значение в том же индексе, что и первый, а затем, когда я меняю главную комбинацию, индекс во второй меняется одновременно Затем я беру значение второго комбо и использую его.

Это код:

public Form1()
{
    eventos = cliente.GetEventsTypes(usuario);

    foreach (EventNo no in eventos)
    {
        cboEventos.Items.Add(no.eventno.ToString() + "--" +no.description.ToString());
        cboEventos2.Items.Add(no.eventno.ToString());
    }
}

private void lista_SelectedIndexChanged(object sender, EventArgs e)
{
    lista2.Items.Add(lista.SelectedItem.ToString());
}

private void cboEventos_SelectedIndexChanged(object sender, EventArgs e)
{
    cboEventos2.SelectedIndex = cboEventos.SelectedIndex;
}
0 голосов
/ 14 декабря 2015

Класс создания:

namespace WindowsFormsApplication1
{
    class select
    {
        public string Text { get; set; }
        public string Value { get; set; }
    }
}

Коды Form1:

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            List<select> sl = new List<select>();
            sl.Add(new select() { Text = "", Value = "" });
            sl.Add(new select() { Text = "AAA", Value = "aa" });
            sl.Add(new select() { Text = "BBB", Value = "bb" });
            comboBox1.DataSource = sl;
            comboBox1.DisplayMember = "Text";
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {

            select sl1 = comboBox1.SelectedItem as select;
            t1.Text = Convert.ToString(sl1.Value);

        }

    }
}
0 голосов
/ 20 февраля 2016

Вот как это делает Visual Studio 2013:

Отдельный предмет:

comboBox1->Items->AddRange(gcnew cli::array< System::Object^  >(1) { L"Combo Item 1" });

Несколько предметов:

comboBox1->Items->AddRange(gcnew cli::array< System::Object^  >(3)
{
    L"Combo Item 1",
    L"Combo Item 2",
    L"Combo Item 3"
});

Нет необходимости делать переопределения классов или включать что-либо еще. И да, звонки comboBox1->SelectedItem и comboBox1->SelectedIndex все еще работают.

0 голосов
/ 06 июля 2016

Это очень простое решение для оконных форм, если все, что нужно, это конечное значение в виде (строки). Имена элементов будут отображаться в поле со списком, и выбранное значение можно будет легко сравнить.

List<string> items = new List<string>();

// populate list with test strings
for (int i = 0; i < 100; i++)
            items.Add(i.ToString());

// set data source
testComboBox.DataSource = items;

и в обработчике события получить значение (строку) выбранного значения

string test = testComboBox.SelectedValue.ToString();
0 голосов
/ 06 апреля 2016

Это похоже на некоторые другие ответы, но компактно и позволяет избежать преобразования в словарь, если у вас уже есть список.

С учетом ComboBox "выпадающего списка" в форме окна и классеSomeClass со свойством типа string Name,

List<SomeClass> list = new List<SomeClass>();

combobox.DisplayMember = "Name";
combobox.DataSource = list;

Это означает, что SelectedItem является SomeClass объектом из list, и каждый элемент в combobox будет отображаться с помощьюего имя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...