Wie erhalte ich Werte für ausgewählte Elemente in CheckBoxList mit foreach in ASP.NET C #?

75

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.

Amin AmiriDarban
quelle

Antworten:

192

Beachten Sie, dass ich es vorziehe, wenn der Code kurz ist.

List<ListItem> selected = CBLGold.Items.Cast<ListItem>()
    .Where(li => li.Selected)
    .ToList();

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();
Tim Schmelter
quelle
@ نرخیاب: Meine Antwort wurde bearbeitet, um zu zeigen, wie nur die Werte ausgewählt werden. varist nur eine Abkürzung für List<ListItem>.
Tim Schmelter
1
Wenn Sie die Fehlermeldung erhalten, dass .Cast keine Methode in der ListItemCollection ist, müssen Sie einen Verweis hinzufügen: "using System.Linq;"
Peter Jacoby
1
Das ist genau das, was ich brauchte, um auf der Serverseite darauf zuzugreifen. String.Join (";", selectedValues.ToArray ())
Muneeb Mirza
Um diese Lösung aufzufüllen und die Werte in eine Liste von int zu konvertieren, führen Sie einfach Folgendes aus: ".Cast <ListItem> () .Where (li => li.Selected) .Select (li => li.Value) .Select ( int.Parse) .ToList () "
TPG
12
foreach (ListItem item in CBLGold.Items)
{
    if (item.Selected)
    {
        string selectedValue = item.Value;
    }
}
Arif Ansari
quelle
10

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...
mreyeros
quelle
2

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 ListControlObjekt hat eine ItemsEigenschaft vom Typ ListItemCollection. ListItemCollectionmacht eine Sammlung von verfügbar ListItems, von denen jede eine SelectedEigenschaft 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:

myCheckBoxList.GetSelectedItems()
KyleMit
quelle
1
List<string> values =new list<string>();
foreach(ListItem Item in ChkList.Item)
{
    if(Item.Selected)
    values.Add(item.Value);
}
Rohini Yejju
quelle
1

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();
TPG
quelle
0
string s= string.Empty

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

{

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

}
Gopal Reddy Vinnamala
quelle
3
1. Sie sollten Ihren Code ein wenig erklären. 2. Warum veröffentlichen Sie eine Antwort auf eine einjährige Frage, für die bereits eine Antwort akzeptiert wurde?
FancyPants
0

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:

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

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.

Slint
quelle
Dies gibt keine Antwort auf die Frage; Es ist nur eine langwierige Beschreibung, wie Sie etwas Ähnliches geschrieben haben, aber es hat nicht funktioniert, weil Sie ... es nicht richtig geschrieben haben. Antworten zum Stapelüberlauf sollten direkte Versuche sein, die gestellte Frage oder das gestellte Problem zu beantworten . Sie sind nicht der Ort, um ähnliche Anekdoten zu teilen.
TylerH
0

Wenn Sie eine Datenbank gebunden checklistboxhaben, funktioniert das Abrufen nicht item(j).Selected, da das Steuerelement kein ausgewähltes Attribut hat. Wenn Sie Auswahl löschen, dh auf Laden, dann versteht es anscheinend jetzt item(j).selected.

Bruce H Bitterman
quelle
0

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());
}
Matthew Lock
quelle