我有一个列表框,通过字典填充了一周中的几天:
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);
}
}
很容易获得一个选定项目的密钥,但我很难尝试多次选择。
答案 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
。