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

81

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


https://dev59.com/zmkw5IYBdhLWcg3w_PXn - dotalchemy
11个回答

210

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

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
1
如果你在ListItemCollection上得到了一个.Cast不是方法的错误,那么你需要添加一个引用:"using System.Linq;" - Peter Jacoby
1
这正是我所需要的,还可以在服务器端访问。 String.Join(";", selectedValues.ToArray()) - Muneeb Mirza
要完善这个解决方案并将值转换为int列表,只需执行以下操作".Cast<ListItem>().Where(li => li.Selected).Select(li => li.Value).Select(int.Parse).ToList()"。 - TPG

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

11

下午好,您可以始终使用一些LINQ来获取所选列表项,然后对结果进行必要的操作:

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

2

在这里建议的基础上,我添加了一个扩展方法,以利用LINQ从任何继承自System.Web.UI.WebControls.ListControl类型中返回所选项的列表。

每个ListControl对象都有一个类型为ListItemCollectionItems属性。 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()

1

补充一下@Tim Schmelter的内容,需要返回List<int>

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

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

1
如果您有一个数据绑定的checklistbox,使用item(j).Selected是无效的,因为该控件没有选定属性。如果您在加载时清除选择,那么它现在似乎理解item(j).selected

1

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

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

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

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. 为什么你要回答一个已经有采纳答案的一年前的问题?
- fancyPants

0
在我的代码后台中,我在Page_Load事件中从SQL数据库创建了一个checkboxlist,在button_click事件中获取了所有的checkboxlist值等等。
所以当我勾选了一些复选框然后点击按钮时,第一件发生的事情是我的page_load事件重新创建了checkboxlist,因此在运行获取checkbox值时没有任何框被选中... 我错过了在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);
 }

输出结果如预期,是一个分号分隔的列表,可以在邮件发送函数中使用:

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

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

这并没有回答问题,只是冗长地描述了你如何编写类似的东西,但它没有起作用,因为你没有正确地编写它。在 Stack Overflow 上的答案应该是直接尝试回答所提出的问题或问题;它们不是分享类似轶事的地方。 - TylerH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接