从使用Dictionary填充的ListBox中检索多个键

时间:2015-02-10 20:48:14

标签: c# winforms

我有一个列表框,通过字典填充了一周中的几天:

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

列表框设置为多选,我想从所选项中获取所有字典键...每当我尝试循环时,我只获得为整个集合选择的第一个键的值。

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

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

很容易获得一个选定项目的密钥,但我很难尝试多次选择。

1 个答案:

答案 0 :(得分: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();
}

但唯一不同的是数字(索引),这是以0开头,而不是字典中的1