如何使用ASP.NET C#中的foreach获取CheckBoxList中选定项的值?

我有一个像这样的CheckBoxList:

<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> 

现在我想使用foreach从这个CheckBoxList中获取所选项目的值,并将这些值放入一个列表中。

注意 :我宁愿代码简短。

请注意,我更喜欢短的代码。

 List<ListItem> selected = CBLGold.Items.Cast<ListItem>() .Where(li => li.Selected) .ToList(); 

或者用一个简单的foreach

 List<ListItem> selected = new List<ListItem>(); foreach (ListItem item in CBLGold.Items) if (item.Selected) selected.Add(item); 

如果你只是想ListItem.Value

 List<string> selectedValues = CBLGold.Items.Cast<ListItem>() .Where(li => li.Selected) .Select(li => li.Value) .ToList(); 

下午好,你总是可以用一个小小的LINQ来获得选定的列表项,然后按照你想要的结果来做:

 var selected = CBLGold.Items.Cast<ListItem>().Where(x => x.Selected); // work with selected... 
  foreach (ListItem item in CBLGold.Items) { if (item.Selected) { string selectedValue = item.Value; } } 

从这里的build议之后,我添加了一个扩展方法来返回任何types的select项目使用LINQ的列表从System.Web.UI.WebControls. ListControlinheritanceSystem.Web.UI.WebControls. ListControl System.Web.UI.WebControls. ListControl

每个ListControl对象都有一个ListItemCollectiontypes的Items属性。 ListItemCollection公开ListItemCollection的集合,每个ListItems都有一个Selected属性。

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 

那么,就这样用这两种语言:

 myCheckBoxList.GetSelectedItems() 
 string s= string.Empty for (int i = 0; i < Chkboxlist.Items.Count; i++) { if (Chkboxlist.Items[i].Selected) { s+= Chkboxlist.Items[i].Value + ";"; } } 
 List<string> values =new list<string>(); foreach(ListItem Item in ChkList.Item) { if(Item.Selected) values.Add(item.Value); } 

这个线程是迄今为止最好的例子!

有一件事是我跑了,既没有为我工作的例子,我花了几个小时的debugging,我可以在世界上的所有原因不明白为什么我住院治疗从我的checkbox列表中select的值。 是因为我的主页吗? 或者是因为我在使用带有AjaxControlkit的ModalPopup,或者是从数据库查询中创build我的checkboxlist的时候,我是否正确?

我终于意识到,我错过了这一切的重要组成部分…

在我的代码隐藏中,我从Page_Load事件中的sql db中创build了一个checkboxlist,在我的button_click事件中,从checkboxlist等获得了所有的值。

所以,当我检查了一些checkbox,然后点击我的button,第一件事情是我的page_load事件重新创buildcheckbox列表,因此没有任何checkbox时,它运行我的获取checkbox的值…我错过了添加在page_load事件if(!this.IsPBackBack)

我希望我的错误和这个答案可以帮助减less一些debugging时间。

 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); } 

和输出如预期的一样,我在mailsend函数中使用了一个分号分隔的列表:

  bill@contoso.com; jeff@corp.inc; sam@dot.net 

一个小问题的长答案。 请注意,我远离这个专家,并知道有更好的解决scheme,但这可能有助于一些。