Как получить значения выбранных элементов в 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 и поместить значения в список.
Примечание. Я бы предпочел, чтобы код был коротким.
Ответы
Ответ 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();