I have a CheckBoxList like this:
<asp:CheckBoxList ID="CBLGold" runat="server" CssClass="cbl">
<asp:ListItem Value="TGJU"> TG </asp:ListItem>
<asp:ListItem Value="GOLDOZ"> Gold </asp:ListItem>
<asp:ListItem Value="SILVEROZ"> Silver </asp:ListItem>
<asp:ListItem Value="NERKH"> NE </asp:ListItem>
<asp:ListItem Value="TALA"> Tala </asp:ListItem>
<asp:ListItem Value="YARAN"> Sekeh </asp:ListItem>
</asp:CheckBoxList>
Now I want to get the value of the selected items from this CheckBoxList using foreach, and put the values into a list.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
Note that I prefer the code to be short.
List<ListItem> selected = CBLGold.Items.Cast<ListItem>() .Where(li => li.Selected) .ToList();
or with a simple foreach
:
List<ListItem> selected = new List<ListItem>(); foreach (ListItem item in CBLGold.Items) if (item.Selected) selected.Add(item);
If you just want the ListItem.Value
:
List<string> selectedValues = CBLGold.Items.Cast<ListItem>() .Where(li => li.Selected) .Select(li => li.Value) .ToList();
Method 2
foreach (ListItem item in CBLGold.Items) { if (item.Selected) { string selectedValue = item.Value; } }
Method 3
Good afternoon, you could always use a little LINQ to get the selected list items and then do what you want with the results:
var selected = CBLGold.Items.Cast<ListItem>().Where(x => x.Selected); // work with selected...
Method 4
Following suit from the suggestions here, I added an extension method to return a list of the selected items using LINQ for any type that Inherits from System.Web.UI.WebControls.ListControl
.
Every ListControl
object has an Items
property of type ListItemCollection
. ListItemCollection
exposes a collection of ListItems
, each of which have a Selected
property.
C Sharp:
public static IEnumerable<ListItem> GetSelectedItems(this ListControl checkBoxList)
{
return from ListItem li in checkBoxList.Items where li.Selected select li;
}
Visual Basic:
<Extension()> _
Public Function GetSelectedItems(ByVal checkBoxList As ListControl) As IEnumerable(Of ListItem)
Return From li As ListItem In checkBoxList.Items Where li.Selected
End Function
Then, just use like this in either language:
myCheckBoxList.GetSelectedItems()
Method 5
List<string> values =new list<string>(); foreach(ListItem Item in ChkList.Item) { if(Item.Selected) values.Add(item.Value); }
Method 6
To top up on @Tim Schmelter, in which to get back the List<int>
instead,
List<string> selectedValues = CBLGold.Items.Cast<ListItem>() .Where(li => li.Selected) .Select(li => li.Value) .Select(int.Parse) .ToList();
Method 7
If you have a databound checklistbox
it does not work to get item(j).Selected
, because the control does not have a selected attribute. If you clearSelections i.e. on Load, then apparently it now understands item(j).selected
.
Method 8
Just in case you want to store the selected values in single column seperated by ,
then you can use below approach
string selectedItems = String.Join(",", CBLGold.Items.OfType<ListItem>().Where(r => r.Selected).Select(r => r.Value));
if you want to store Text not values then
Change the r.Value to r.Text
Method 9
string s= string.Empty for (int i = 0; i < Chkboxlist.Items.Count; i++) { if (Chkboxlist.Items[i].Selected) { s+= Chkboxlist.Items[i].Value + ";"; } }
Method 10
In my codebehind i created a checkboxlist from sql db in my Page_Load event and in my button_click event did all the get values from checkboxlist etc.
So when i checked some checkboxes and then clicked my button the first thing that happend was that my page_load event recreated the checkboxlist thus not having any boxes checked when it ran my get checkbox values…
I’ve missed to add in the page_load event the if (!this.IsPostBack)
protected void Page_Load(object sender, EventArgs e) { if (!this.IsPostBack) { // db query and create checkboxlist and other SqlConnection dbConn = new SqlConnection(WebConfigurationManager.ConnectionStrings["ConnString"].ConnectionString); string query; try { query = "SELECT [name], [mail] FROM [users]"; dbConn.Open(); SqlDataAdapter da = new SqlDataAdapter(query, dbConn); DataSet ds = new DataSet(); da.Fill(ds); if (ds.Tables[0].Rows.Count != 0) { checkboxlist1.DataSource = ds; checkboxlist1.DataTextField = "name"; checkboxlist1.DataValueField = "mail"; checkboxlist1.DataBind(); } else { Response.Write("No Results found"); } } catch (Exception ex) { Response.Write("<br>" + ex); } finally { dbConn.Close(); } } } protected void btnSend_Click(object sender, EventArgs e) { string strChkBox = string.Empty; foreach (ListItem li in checkboxlist1.Value) { if (li.Selected == true) { strChkBox += li.Value + "; "; // use only strChkBox += li + ", "; if you want the name of each checkbox checked rather then it's value. } } Response.Write(strChkBox); }
And the output was as expected, a semicolon separeted list for me to use in a mailsend function:
<a href="https://getridbug.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c7a5aeabab87a4a8a9b3a8b4a8e9a4a8aa">[email protected]</a>; <a href="https://getridbug.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="3e545b58587e5d514c4e1057505d">[email protected]</a>; <a href="https://getridbug.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="97e4f6fad7f3f8e3b9f9f2e3">[email protected]</a>
A long answer to a small problem. Please note that i’m far from an expert at this and know that there are better solutions then this but it might help out for some.
Method 11
I like to use this simple method to get the selected values and join them into a string
private string JoinCBLSelectedValues(CheckBoxList cbl, string separator = "") { return string.Join(separator, cbl.Items.Cast<ListItem>().Where(li => li.Selected).ToList()); }
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0