it-swarm.com.ru

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

У меня есть 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, и поместить значения в список.

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

64
Amin AmiriDarban

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

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();
175
Rango
        foreach (ListItem item in CBLGold.Items)
        {
            if (item.Selected)
            {
                string selectedValue = item.Value;
            }
        }
10
Arif Ansari

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

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

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

Каждый объект ListControl имеет свойство Items типа ListItemCollection . ListItemCollection предоставляет коллекцию ListItems , каждый из которых имеет свойство Selected.

С 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()
2
KyleMit

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

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

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

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

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

В моем codebehind я создал список checkbox из sql db в моем событии Page_Load и в моем событии button_click сделал все значения из checkboxlist и т.д. 

Поэтому, когда я установил некоторые флажки, а затем нажал на кнопку, первое, что случилось, было то, что мое событие page_load воссоздало список флажков, таким образом, не установив никаких флажков при запуске значений моего флажка get ... Я пропустил добавление в событие 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);
 }

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

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

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

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

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

{

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

}
0
Gopal Reddy Vinnamala