J'ai un CheckBoxList comme ceci:
<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>
Maintenant, je veux obtenir la valeur des éléments sélectionnés à partir de cette CheckBoxList en utilisant foreach, et mettre les valeurs dans une liste.
Note : Je préférerais que le code soit court.
Notez que je préfère que le code soit court.
List<ListItem> selected = CBLGold.Items.Cast<ListItem>()
.Where(li => li.Selected)
.ToList();
ou avec une simple foreach
:
List<ListItem> selected = new List<ListItem>();
foreach (ListItem item in CBLGold.Items)
if (item.Selected) selected.Add(item);
Si vous voulez juste le ListItem.Value
:
List<string> selectedValues = CBLGold.Items.Cast<ListItem>()
.Where(li => li.Selected)
.Select(li => li.Value)
.ToList();
foreach (ListItem item in CBLGold.Items)
{
if (item.Selected)
{
string selectedValue = item.Value;
}
}
Bonjour, vous pouvez toujours utiliser un peu LINQ pour obtenir les éléments de la liste sélectionnée, puis faire ce que vous voulez avec les résultats:
var selected = CBLGold.Items.Cast<ListItem>().Where(x => x.Selected);
// work with selected...
Suivant les suggestions présentées ici, j’ai ajouté une méthode d’extension pour renvoyer une liste des éléments sélectionnés à l’aide de LINQ pour tout type héritant de System.Web.UI.WebControls.ListControl
.
Chaque objet ListControl
a une Items
propriété de type ListItemCollection
. ListItemCollection
expose une collection de ListItems
, chacun d'eux ayant une propriété Selected
.
public static IEnumerable<ListItem> GetSelectedItems(this ListControl checkBoxList)
{
return from ListItem li in checkBoxList.Items where li.Selected select li;
}
<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
Ensuite, utilisez comme ceci dans les deux langues:
myCheckBoxList.GetSelectedItems()
Pour recharger sur @Tim Schmelter, dans lequel récupérer le List<int>
,
List<string> selectedValues = CBLGold.Items.Cast<ListItem>()
.Where(li => li.Selected)
.Select(li => li.Value)
.Select(int.Parse)
.ToList();
Ce fil était de loin le meilleur avec beaucoup de bons exemples!
Une chose à laquelle j’ai été confronté n’était aucun des exemples qui fonctionnaient pour moi et j’ai passé des heures à déboguer. Je ne pouvais pas, pour toutes les raisons du monde, comprendre pourquoi j’ai réussi à obtenir les valeurs sélectionnées dans ma liste de cases à cocher . Était-ce à cause de ma page maître? Ou parce que j'utilisais un ModalPopup avec AjaxControlkit ou si j'allais dans le bon sens lors de la création de ma liste de cases à cocher à partir d'une requête de base de données?
J'ai finalement réalisé que j'avais raté une partie importante de tout ça ...
Dans mon codebehind j'ai créé une checkbox list à partir de sql db dans mon événement Page_Load et dans mon événement button_click fait toutes les valeurs de get à partir de checkboxlist etc.
Ainsi, lorsque j'ai coché certaines cases à cocher et que j'ai ensuite cliqué sur mon bouton, la première chose qui s'est produite est que mon événement page_load a recréé la liste de cases à cocher, de sorte qu'aucune case ne soit cochée lors de l'exécution de mes valeurs de case à cocher .... l'événement page_load the if (! this.IsPostBack)
J'espère que mon erreur et cette réponse peuvent aider à réduire certaines heures de débogage pour certaines personnes.
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);
}
Et la sortie était comme prévu, une liste séparée par des points-virgules que je pouvais utiliser dans une fonction mailsend:
[email protected]; [email protected]; [email protected]
Une longue réponse à un petit problème. Veuillez noter que je suis loin d'être un expert en la matière et que je sais qu'il existe de meilleures solutions que celle-ci, mais que cela pourrait aider pour certains.
List<string> values =new list<string>();
foreach(ListItem Item in ChkList.Item)
{
if(Item.Selected)
values.Add(item.Value);
}
string s= string.Empty
for (int i = 0; i < Chkboxlist.Items.Count; i++)
{
if (Chkboxlist.Items[i].Selected)
{
s+= Chkboxlist.Items[i].Value + ";";
}
}