Search

Dec 8, 2008

Querying Selected Items From ListItemCollection Using LINQ

Working with ListItemCollection is general practices and getting single value for that it's like child's play. What if you need the list of items which are selected?

I am sure you probably use foreach loop something like

List<ListItem> selectedList = new List<ListItem>();
foreach(ListItem li in cbList.Items)
{
if (li.Selected)
selectedList.Add(li);
}

Or advance user use the functionality of C#2.0 using yield keyword

private IEnumerable<ListItem> GetSelectedItems(ListControl listControl)
{
foreach (ListItem itm in listControl.Items)
{
if (itm.Selected)
yield return itm;
}
}
.
.
.
.
.
.
{
IEnumerable<ListItem> selectedList = new List<ListItem>();
selectedList = GetSelectedItems(cbList);
}
And now using LINQ C#3.0

var selectedItems =
from li in cbList.Items.Cast<ListItem>()
where li.Selected == true
select li;

The only difference is the Cast, we need to make ListItemCollection generic so we can use it in LINQ query.

And now lets see using Lambda Expression C#3.0

List<ListItem> selectedItems =
cbList.Items.Cast<ListItem>()
.Where(item => item.Selected == true).ToList();

Here also we did cast to get the extension method Where. And in Where condition we write the lambda expression instead of anonymous delegate function.

We can even write extension method on base class ListControl so we can have selected items for all the list control. Lets write one extension method on ListControl

public static List<ListItem> SelectedItems(this ListControl lc)
{
List<ListItem> selectedItems =
lc.Items.Cast<ListItem>()
.Where(item => item.Selected == true).ToList();
return selectedItems;
}

And get the selected items using our extension method we will just call the SelectedItems method.

CheckBoxList cbList = new CheckBoxList();
cbList.SelectedItems();

3 comments:

Deepika Khorana said...

if we change text in lisitemcollection then it change the checkbox list items also.
How we can fetch the checklist selected items without applying loop.

Pla said...

Thanks, Thanks, Thanks

I am using this to get the selected items of a dropdowncheckbox, but some of the values have several commas so I was unable to do a split.

The part of the Cast() saved my day.

regards,
Jose

Pla said...

Thanks, Thanks, Thanks

This saved my day,
var result = from li in checkBox.Items.Cast()
where li.Selected == true
select li;
result.Count();
List selectedItems = checkBox.Items.Cast().Where(item => item.Selected == true).ToList();
selectedItems.Count();
if (selectedItems.Count() == checkBox.Items.Count)
{
checkBox.Texts.SelectBoxCaption = Constants.DROPDOWN_LIST_SELECT_ALL;
}

The Cast to the Items is what I needed