Подтвердить что ты не робот

Как получить значения выбранных элементов в CheckBoxList с foreach в ASP.NET С#?

У меня есть 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>

Теперь я хочу получить значение выбранных элементов из этого CheckBoxList с помощью foreach и поместить значения в список.

Примечание. Я бы предпочел, чтобы код был коротким.

4b9b3361

Ответ 1

Обратите внимание, что я предпочитаю, чтобы код был коротким.

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

Ответ 2

Добрый день, вы всегда можете использовать небольшую LINQ для получения выбранных элементов списка, а затем делать то, что хотите, с результатами:

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

Ответ 3

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

Ответ 4

В соответствии с предложениями здесь я добавил метод расширения, чтобы возвращать список выбранных элементов, используя LINQ для любого типа, который наследует от System.Web.UI.WebControls.ListControl.

Каждый объект ListControl имеет свойство 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()

Ответ 5

string s= string.Empty

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

{

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

}

Ответ 6

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

Ответ 7

Этот поток был безусловно лучшим со многими хорошими примерами!

Одна вещь, с которой я столкнулся, не была ни одним из примеров, которые работали для меня, и я потратил много времени на отладку, я мог бы по всем причинам в мире не понимать, почему мне удалось получить выбранные значения из моего списка флажков. Это было из-за моей главной страницы? Или потому, что я использовал ModalPopup с AjaxControlkit или был ли я правильным путем при создании моего checkboxlist из запроса базы данных?

Я наконец понял, что я пропустил важную роль во всем этом...

В моем коде я создал checkboxlist из sql db в моем событии Page_Load и в моем событии button_click сделал все значения get из 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 value.
       }
    }
   Response.Write(strChkBox);
 }

И результат был таким, как ожидалось, список разделенных точкой с запятой, который я мог использовать в функции mailsend:

    [email protected]; [email protected]; [email protected]

Длинный ответ на небольшую проблему. Обратите внимание, что я далек от эксперта по этому вопросу и знаю, что есть лучшие решения, но это может помочь некоторым.

Ответ 8

Чтобы пополнить значение @Tim Schmelter, чтобы вместо List<int> вернуть

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