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


75

我有一个这样的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中获取所选项目的值,并将其放入列表中。


Answers:


194

请注意,我希望代码简短。

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

@نرخیاب:编辑了我的答案,以显示如何仅选择值。var只是的捷径List<ListItem>
Tim Schmelter 2013年

1
如果您发现.Cast不是ListItemCollection上的方法的错误,则需要添加引用:“ using System.Linq;”。
彼得·雅各比

1
那正是我需要在服务器端访问的内容。String.Join(“;”,selectedValues.ToArray())
Muneeb Mirza

要对此解决方案充值,要将值转换为int列表,只需执行以下操作:“ .Cast <ListItem>()。Where(li => li.Selected).Select(li => li.Value).Select( int.Parse).ToList()”
TPG


10

下午好,您总是可以使用一些LINQ来获取选定的列表项,然后对结果进行所需的操作:

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

2

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

每个ListControl对象都有一个Itemstype属性ListItemCollectionListItemCollection公开的集合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()


1

要在@Tim Schmelter充值,然后取回它List<int>

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

0
string s= string.Empty

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

{

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

}

3
1.您应该稍微解释一下代码。2.为什么要发布一个已有答案的一岁问题的答案?
fancyPant 2014年

0

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

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

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


这不能为问题提供答案;这只是关于如何编写类似内容的冗长描述,但由于您...编写不正确,因此无法使用。堆栈溢出的答案应该是直接尝试回答所提出的问题提出的问题; 他们不是分享类似轶事的地方。
TylerH'2

0

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


0

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

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

0

万一您想将所选值存储在由分隔的单列中,,则可以使用以下方法

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

如果要存储文本而不是值,则将r.Value更改为r.Text

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.