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

时间:2013-09-20 19:09:26

标签: c# asp.net list 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中获取所选项的值,并将值放入列表中。

注意:我希望代码简短。

11 个答案:

答案 0 :(得分:178)

  

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

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

答案 1 :(得分:10)

下午好,您可以随时使用一点LINQ获取所选列表项,然后根据结果执行您想要的操作:

var selected = CBLGold.Items.Cast<ListItem>().Where(x => x.Selected);
// work with selected...

答案 2 :(得分:10)

        foreach (ListItem item in CBLGold.Items)
        {
            if (item.Selected)
            {
                string selectedValue = item.Value;
            }
        }

答案 3 :(得分:2)

根据这里的建议,我添加了一个扩展方法,使用LINQ为任何继承自System.Web.UI.WebControls.ListControl的类型返回所选项的列表。

每个ListControl对象都具有Items类型的ListItemCollection属性。 ListItemCollection公开了ListItems的集合,每个集合都有Selected属性。

C夏普:

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

答案 4 :(得分:1)

充值@Tim Schmelter,取而代之的是List<int>

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

答案 5 :(得分:1)

如果您想将选定的值存储在由 , 分隔的单列中,那么您可以使用以下方法

string selectedItems = String.Join(",", CBLGold.Items.OfType<ListItem>().Where(r => r.Selected).Select(r => r.Value));

如果你想存储文本而不是值那么 将 r.Value 更改为 r.Text

答案 6 :(得分:0)

string s= string.Empty

for (int i = 0; i < Chkboxlist.Items.Count; i++)

{

    if (Chkboxlist.Items[i].Selected)
    {
        s+= Chkboxlist.Items[i].Value + ";"; 
    }

}

答案 7 :(得分:0)

List<string> values =new list<string>();
foreach(ListItem Item in ChkList.Item)
{
    if(Item.Selected)
    values.Add(item.Value);
}

答案 8 :(得分:0)

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

我遇到的一件事是这些例子都没有给我工作,我花了几个小时的调试,我可能因为世界上所有的原因不明白我为什么设法从我的复选框列表中获取所选值。 是因为我的母版页?或者因为我在使用带有AjaxControlkit的ModalPopup时,或者在从数据库查询创建复选框列表时采用了正确的方法?

我终于意识到我错过了所有这一切的重要部分......

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

因此,当我选中一些复选框然后单击我的按钮时,发生的第一件事是我的page_load事件重新创建了复选框列表,因此当它运行我的获取复选框值时没有检查任何框... 我错过了在page_load事件中添加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);
 }

输出正如预期的那样,我可以在mailsend函数中使用分号分隔列表:

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

对一个小问题的长期回答。请注意,我远非专家,并且知道有更好的解决方案,但这可能对某些人有帮助。

答案 9 :(得分:0)

如果数据绑定为checklistbox,则无法获得item(j).Selected,因为控件没有选定的属性。如果您清除了Selection(即在加载时),那么显然它现在可以理解item(j).selected

答案 10 :(得分:0)

我喜欢使用这种简单的方法来获取选定的值并将其连接为字符串

private string JoinCBLSelectedValues(CheckBoxList cbl, string separator = "")
{
    return string.Join(separator, cbl.Items.Cast<ListItem>().Where(li => li.Selected).ToList());
}