2015-02-10 2 views
2

У меня есть ListBox заполнены дни недели с помощью словаря:Получить несколько ключей от ListBox, заполненного словарь

private Dictionary<int, string> Days() 
{ 
    Dictionary<int, string> day = new Dictionary<int, string>(); 
    day.Add(1, "Sunday"); 
    day.Add(2, "Monday"); 
    day.Add(3, "Tuesday"); 
    day.Add(4, "Wednesday"); 
    day.Add(5, "Thursday"); 
    day.Add(6, "Friday"); 
    day.Add(7, "Saturday"); 
    return day; 
} 


private void SetDays() 
{ 
    listBoxDays.DataSource = new BindingSource(Days(), null); 
    listBoxDays.DisplayMember = "Value"; 
    listBoxDays.ValueMember = "Key"; 
    listBoxDays.SelectedIndex = 0; 
} 

ListBox настроен для множественного выбора, и я хотел бы, чтобы захватить все словарю Ключи от выбранных элементов ... Всякий раз, когда я пытаюсь выполнить цикл, я получаю только значение первого ключа, выбранного для всей коллекции.

private void GatherDays() 
{ 
    List<int> list = new List<int>(); 

    foreach (var item in listBoxDays.SelectedItems) 
    { 
     list.Add((int)listBoxDays.SelectedValue); 
    } 
} 

Легко получить ключ один выбранный элемент, но я с очень трудное время, пытаясь получить несколько выбранных.

+0

Какое приложение вы нацеливаете? ASP.Net, WinForm? – Habib

+0

просто любопытно, в чем разница между 'listBoxDays' и' listBoxBuildDays'? – ryanyuyu

+0

Это для приложения winform, и, пожалуйста, извините опечатку в listboxdays & listboxbuilddays ... они - то же самое. – Mikem

ответ

4

Измените метод GatherDays как:

private void GatherDays() 
{ 
    List<int> list = new List<int>(); 
    foreach (KeyValuePair<int, string> item in listBoxBuildDays.SelectedItems) 
    { 
     list.Add(item.Key); 
    } 
} 

Или вы можете сократить свой код с помощью LINQ, как:

List<int> list =listBoxBuildDays.SelectedItems 
        .OfType<KeyValuePair<int, string>>() 
        .Select(r => r.Key) 
        .ToList(); 

В настоящее время проблема обусловлена:

list.Add((int)listBoxDays.SelectedValue); 

SelectedValue представляет выбранное значение с наименьшим индексом в Items.

См: ListControl.SelectedValue Property

Если выбрано несколько элементов, значение выбранного элемента с низкий индекс возвращается. Если элемент не выбран, возвращается пустая строка ("").

Вот почему вы видите только одно значение в своем списке.

Еще одна вещь, которую нужно добавить.

Вы можете использовать DayOfWeek enumeration для работы, а не словарь, как:

В SetDays

private void SetDays() 
{ 
    listBoxBuildDays.DataSource = Enum.GetValues(typeof(DayOfWeek)); 
    listBoxBuildDays.SelectedIndex = 0; 
} 

и GatherDays

private void GatherDays() 
{ 
    List<int> list = listBoxBuildDays 
     .SelectedItems.Cast<DayOfWeek>() 
     .Select(r => (int) r) 
     .ToList(); 
} 

Но единственное, что другая бы номер (index), это начинается с 0, вместо этого из 1 как в вашем словаре.

+0

Хабиб, спасибо! Я некоторое время задерживался на этом, но до сих пор не знал о «KeyValuePair». Прекрасно работает! Еще раз спасибо! – Mikem

+0

@Mikem, просто добавил еще один вариант использования перечисления DayOfWeek вместо собственного словаря. – Habib

+0

Благодарим за добавление Хабиба! В моем случае я хотел, чтобы мои дни начинались с 1, поэтому я пошел с Словарем, чтобы избежать индекса на основе нуля. – Mikem

Смежные вопросы