views:

640

answers:

2

Anyone know of a smooth way to get all of the selected items in a listbox control by using extension methods?

And, please, spare me the argument of it's irrelevant as to how one gets such a list because in the end everything uses a loop to iterate over the items and find the selected ones anyway.

+5  A: 
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);
    }
}
Rubens Farias
Thank you! This is great.
Jagd
+1  A: 

Extension method:

public static List<ListItem> GetSelectedItems(this ListBox lst)
{
    return lst.Items.OfType<ListItem>().Where(i => i.Selected).ToList();
}

You can call it on your listbox like:

List<ListItem> selectedItems = myListBox.GetSelectedItems();

You could also do the conversion using a 'Cast' on the list box items like:

return lst.Items.Cast<ListItem>().Where(i => i.Selected).ToList();

Not sure which will perform better OfType or Cast (my hunch is Cast).

Edit based on Ruben's feedback for a generic ListControl method which would indeed make it much more useful extension method:

public static List<ListItem> GetSelectedItems(this ListControl lst)
{
    return lst.Items.OfType<ListItem>().Where(i => i.Selected).ToList();
}
Kelsey
You could also to replace `ListBox` for `ListControl`, so your extension works for all list controls, as `DropDownList`, `CheckBoxList`, `RadioButtonList` and so on
Rubens Farias
Good idea.. will adjust my answer to reflect that.
Kelsey
`Cast` is a bit faster, but can lead to `InvalidCastException`; seems Cast is applicable here, since `Items.Add` just receive `ListItem` objects
Rubens Farias