webentwicklung-frage-antwort-db.com.de

Wie erhalte ich Werte von ausgewählten Elementen in CheckBoxList mit foreach in ASP.NET C #

Ich habe eine CheckBoxList wie diese:

<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 aufnehmen.

Hinweis : Ich würde es vorziehen, wenn der Code kurz ist.

64

Beachten Sie, dass ich es vorziehen sollte, dass der Code kurz ist.

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

oder mit einer einfachen foreach:

List<ListItem> selected = new List<ListItem>();
foreach (ListItem item in CBLGold.Items)
    if (item.Selected) selected.Add(item);

Wenn Sie nur den ListItem.Value wünschen:

List<string> selectedValues = CBLGold.Items.Cast<ListItem>()
   .Where(li => li.Selected)
   .Select(li => li.Value)
   .ToList();
175
Rango
        foreach (ListItem item in CBLGold.Items)
        {
            if (item.Selected)
            {
                string selectedValue = item.Value;
            }
        }
10
Arif Ansari

Guten Tag, Sie können immer ein wenig LINQ verwenden, um die ausgewählten Listenelemente abzurufen, und dann mit den Ergebnissen tun, was Sie möchten:

var selected = CBLGold.Items.Cast<ListItem>().Where(x => x.Selected);
// work with selected...
10
mreyeros

Im Anschluss an die Vorschläge hier habe ich eine Erweiterungsmethode hinzugefügt, um eine Liste der ausgewählten Elemente mithilfe von LINQ für jeden Typ zurückzugeben, der von System.Web.UI.WebControls.ListControl stammt. 

Jedes ListControl-Objekt hat eine Items - Eigenschaft des Typs ListItemCollection . ListItemCollection macht eine Auflistung von ListItems verfügbar, von denen jede eine Selected-Eigenschaft hat.

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

Dann verwenden Sie einfach wie folgt in beiden Sprachen:

myCheckBoxList.GetSelectedItems()
2
KyleMit

Zum Aufladen von @ Tim Schmelter, in dem stattdessen der List<int> zurückgegeben wird,

List<string> selectedValues = CBLGold.Items.Cast<ListItem>()
   .Where(li => li.Selected)
   .Select(li => li.Value)
   .Select(int.Parse)
   .ToList();
1
teapeng

Dieser Thread war mit vielen guten Beispielen bei weitem der beste! 

Eine Sache, auf die ich stieß, war keines der Beispiele, die für mich funktionierten, und ich verbrachte stundenlanges Debuggen. Ich konnte aus allen Gründen in der Welt nicht verstehen, warum ich es geschafft habe, die ausgewählten Werte aus meiner Checkbox-Liste zu holen. War es wegen meiner Masterseite? Oder weil ich ein ModalPopup mit AjaxControlkit verwendet habe oder beim Erstellen meiner Checkboxliste aus einer Datenbankabfrage den richtigen Weg eingeschlagen habe?

Endlich wurde mir klar, dass ich bei all dem einen wichtigen Teil vermisst habe ...

In meinem Codebehind habe ich eine Checkboxliste aus SQL Db in meinem PageLoad -Ereignis erstellt, und in meinem button_click -Ereignis wurden alle Werte von der Checkboxliste usw. abgerufen. 

Wenn ich also einige Checkboxen anklickte und dann auf meinen Button klickte, passierte als Erstes, dass mein page_load -Ereignis die Checkboxliste neu erstellte. Daher wurden keine Kontrollkästchen aktiviert, wenn meine get-Checkbox-Werte ausgeführt wurden ... .__ das page_load -Ereignis das if (! this.IsPostBack)

Ich hoffe, dass mein Fehler und diese Antwort helfen können, einige Debugging-Stunden für einige da draußen zu minimieren.

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 ein Semikolon getrennte Liste, die ich in einer Mail-Send-Funktion verwenden konnte:

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

Eine lange Antwort auf ein kleines Problem. Bitte beachten Sie, dass ich weit davon entfernt bin, ein Experte zu sein, und ich weiß, dass es bessere Lösungen gibt als diese, aber es kann für einige hilfreich sein.

0
Slint
List<string> values =new list<string>();
foreach(ListItem Item in ChkList.Item)
{
    if(Item.Selected)
    values.Add(item.Value);
}
0
Rohini Yejju
string s= string.Empty

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

{

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

}