Ich habe eine CheckBoxList wie folgt:
<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>
Jetzt möchte ich den Wert der ausgewählten Elemente mit foreach aus dieser CheckBoxList abrufen und die Werte in eine Liste einfügen.
Antworten:
Beachten Sie, dass ich es vorziehe, wenn der Code kurz ist.
oder mit einem einfachen
foreach
:List<ListItem> selected = new List<ListItem>(); foreach (ListItem item in CBLGold.Items) if (item.Selected) selected.Add(item);
Wenn Sie nur das wollen
ListItem.Value
:List<string> selectedValues = CBLGold.Items.Cast<ListItem>() .Where(li => li.Selected) .Select(li => li.Value) .ToList();
quelle
var
ist nur eine Abkürzung fürList<ListItem>
.foreach (ListItem item in CBLGold.Items) { if (item.Selected) { string selectedValue = item.Value; } }
quelle
Guten Tag, Sie können immer einen kleinen LINQ verwenden, um die ausgewählten Listenelemente abzurufen und dann mit den Ergebnissen das zu tun, was Sie wollen:
var selected = CBLGold.Items.Cast<ListItem>().Where(x => x.Selected); // work with selected...
quelle
In Anlehnung an die Vorschläge hier habe ich eine Erweiterungsmethode hinzugefügt, um eine Liste der ausgewählten Elemente mit LINQ für jeden Typ zurückzugeben, von dem erbt .
System.Web.UI.WebControls.ListControl
Jedes
ListControl
Objekt hat eineItems
Eigenschaft vom TypListItemCollection
.ListItemCollection
macht eine Sammlung von verfügbarListItems
, von denen jede eineSelected
Eigenschaft hat.C scharf:
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
Verwenden Sie dann einfach Folgendes in beiden Sprachen:
quelle
List<string> values =new list<string>(); foreach(ListItem Item in ChkList.Item) { if(Item.Selected) values.Add(item.Value); }
quelle
Um @Tim Schmelter aufzufüllen, in dem Sie
List<int>
stattdessen das zurückbekommen ,List<string> selectedValues = CBLGold.Items.Cast<ListItem>() .Where(li => li.Selected) .Select(li => li.Value) .Select(int.Parse) .ToList();
quelle
string s= string.Empty for (int i = 0; i < Chkboxlist.Items.Count; i++) { if (Chkboxlist.Items[i].Selected) { s+= Chkboxlist.Items[i].Value + ";"; } }
quelle
In meinem Codebehind habe ich eine Checkbox-Liste aus SQL DB in meinem Page Load-Ereignis erstellt und in meinem Button_Click-Event alle Get-Werte aus der Checkbox-Liste usw. erstellt.
Als ich also einige Kontrollkästchen aktiviert und dann auf meine Schaltfläche geklickt habe, war das erste, was passiert ist, dass mein page_load-Ereignis die Checkbox-Liste neu erstellt hat, sodass beim Ausführen meiner get checkbox-Werte keine Kontrollkästchen aktiviert wurden ... Ich habe es versäumt, das page_load-Ereignis hinzuzufügen das 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); }
Und die Ausgabe war wie erwartet eine durch Semikolons getrennte Liste, die ich in einer Mail-End-Funktion verwenden konnte:
Eine lange Antwort auf ein kleines Problem. Bitte beachten Sie, dass ich in diesem Bereich kein Experte bin und weiß, dass es bessere Lösungen als diese gibt, aber es könnte für einige hilfreich sein.
quelle
Wenn Sie eine Datenbank gebunden
checklistbox
haben, funktioniert das Abrufen nichtitem(j).Selected
, da das Steuerelement kein ausgewähltes Attribut hat. Wenn Sie Auswahl löschen, dh auf Laden, dann versteht es anscheinend jetztitem(j).selected
.quelle
Ich verwende diese einfache Methode gerne, um die ausgewählten Werte abzurufen und zu einer Zeichenfolge zusammenzufügen
private string JoinCBLSelectedValues(CheckBoxList cbl, string separator = "") { return string.Join(separator, cbl.Items.Cast<ListItem>().Where(li => li.Selected).ToList()); }
quelle