【发布时间】:2009-12-02 00:28:44
【问题描述】:
任何人都知道使用扩展方法在列表框控件中获取所有选定项的平滑方法吗?
并且,请不要让我争论 它与如何获得这样一个列表无关,因为最后一切都使用循环来迭代项目并找到选定的项目。
【问题讨论】:
任何人都知道使用扩展方法在列表框控件中获取所有选定项的平滑方法吗?
并且,请不要让我争论 它与如何获得这样一个列表无关,因为最后一切都使用循环来迭代项目并找到选定的项目。
【问题讨论】:
var selected = yourListBox.Items.GetSelectedItems();
//var selected = yourDropDownList.Items.GetSelectedItems();
//var selected = yourCheckBoxList.Items.GetSelectedItems();
//var selected = yourRadioButtonList.Items.GetSelectedItems();
public static class Extensions
{
public static IEnumerable<ListItem> GetSelectedItems(
this ListItemCollection items)
{
return items.OfType<ListItem>().Where(item => item.Selected);
}
}
【讨论】:
扩展方法:
public static List<ListItem> GetSelectedItems(this ListBox lst)
{
return lst.Items.OfType<ListItem>().Where(i => i.Selected).ToList();
}
你可以在你的列表框上调用它:
List<ListItem> selectedItems = myListBox.GetSelectedItems();
您还可以在列表框项目上使用“Cast”进行转换,例如:
return lst.Items.Cast<ListItem>().Where(i => i.Selected).ToList();
不确定OfType 或Cast 哪个性能更好(我的直觉是Cast)。
编辑基于 Ruben 对通用 ListControl 方法的反馈,这确实会使其更有用的扩展方法:
public static List<ListItem> GetSelectedItems(this ListControl lst)
{
return lst.Items.OfType<ListItem>().Where(i => i.Selected).ToList();
}
【讨论】:
ListBox 替换为ListControl,这样您的扩展程序适用于所有列表控件,如DropDownList、CheckBoxList、RadioButtonList 等
Cast 有点快,但可以导致InvalidCastException;似乎 Cast 在这里适用,因为 Items.Add 只接收 ListItem 对象
您好,我在这篇文章中使用 VB.NET 为这个问题创建了一个解决方案:
Getting all selected values from an ASP ListBox
下面这段代码和上面的链接是一样的:
Public Shared Function getSelectedValuesFromListBox(ByVal objListBox As ListBox) As String
Dim listOfIndices As List(Of Integer) = objListBox.GetSelectedIndices().ToList()
Dim values As String = String.Empty
For Each indice As Integer In listOfIndices
values &= "," & objListBox.Items(indice).Value
Next indice
If Not String.IsNullOrEmpty(values) Then
values = values.Substring(1)
End If
Return values
End Function
希望对你有帮助。
【讨论】: