Як отримати значення вибраних елементів у CheckBoxList за допомогою foreach в ASP.NET C #?


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>

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


Відповіді:


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>.
Тім Шмельтер

1
Якщо ви отримуєте помилку, що .Cast не є методом у ListItemCollection, вам потрібно буде додати посилання: "using System.Linq;"
Пітер Джейкобі

1
Це саме те, що мені потрібно було плюс для доступу на стороні сервера. String.Join (";", selectedValues.ToArray ())
Muneeb Mirza

Щоб поповнити це рішення, щоб перетворити значення у список int, просто зробіть це ".Cast <ListItem> () .Where (li => li.Selected). Виберіть (li => li.Value). Виберіть ( 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об'єкт має 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()


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. Чому ви публікуєте відповідь на однорічне запитання, яке вже має прийняту відповідь?
fancyPants

0

У моєму codebehind я створив контрольний список із sql db у своїй події Page_Load, а в моїй події button_click зробив усі значення отримання з контрольного списку тощо.

Отже, коли я позначив деякі прапорці, а потім клацнув на моїй кнопці, перше, що трапилось, було те, що моя подія page_load відтворила контрольний список, таким чином, не встановивши жодних полів, коли він запускав мої значення check checkbox ... the 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

Довга відповідь на невелику проблему. Зверніть увагу, що я далеко не фахівець у цьому, і знаю, що є кращі рішення, ніж це, але для деяких це може допомогти.


Це не дає відповіді на запитання; це просто довгий опис того, як ви написали подібну річ, але це не спрацювало, тому що ви ... написали це неправильно. Відповіді на переповнення стека мають бути прямими спробами відповісти на поставлене запитання або поставлену проблему ; їм не місце поділитися подібними анекдотами.
TylerH

0

Якщо у вас є прив'язка даних, отримати checklistboxце не вдається item(j).Selected, оскільки елемент керування не має вибраного атрибута. Якщо очистити Selections, тобто на Load, то, мабуть, це тепер зрозуміло 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.