32 Stimmen

Wie wähle ich alle Elemente in einem Listenfeld aus, wenn das Kontrollkästchen aktiviert ist?

Ich muss alle Elemente in einer ListBox auswählen, wenn eine CheckBox angeklickt wird. Ist es möglich, alle Elemente in der ListBox mit einer einzigen Codezeile auszuwählen? Oder muss ich alle Elemente in einer Schleife durchlaufen und für jedes einzelne Element "selected" auf "true" setzen?

1voto

Robin Punkte 688

Ich verwende Mikas Lösung, die jedoch sehr langsam sein kann, wenn Sie Tausende von Artikeln haben. Um die Geschwindigkeit massiv zu erhöhen, können Sie die Sichtbarkeit kurzzeitig ausschalten. Die Listbox verschwindet während des Vorgangs nicht wirklich, wie Sie vielleicht vermuten, aber die Auswahl erfolgt in meinem Fall mindestens 10x schneller.

myListBox.Visible = false;
for (int i = 0; i < myListBox.Items.Count;i++)
{
    myListBox.SetSelected(i, true);
}
myListBox.Visible = true;

8 Stimmen

Ich glaube, die myListBox.Visible = false ist schneller, weil sie das Zeichnen während der Aktualisierung vermeidet. Ich würde die bereitgestellten Methoden verwenden myListBox.BeginUpdate() y myListBox.EndUpdate() :)

2 Stimmen

+1 für den Kommentar von DiogoNeves. Es ist besser, weil es auch bewirkt, dass der Fokus auf der Listbox bleibt. Bei Robins Lösung muss man myListBox.Focus() aufrufen, nachdem man sie wieder sichtbar gemacht hat.

1voto

Justin Punkte 1029

In meinem Fall hatte ich mehr als 10.000 Artikel, und die einfache Schleifenmethode brauchte fast eine Minute für den Abschluss. Mit @DiogoNeves Antwort und erweitern es wollte ich in der Lage sein, alle (Strg+A) & Kopieren (Strg+C) zu markieren. Ich behandelte diese 2 Möglichkeiten. ich verwendet die BeginUpdate() und EndUpdate(), um Zeichnung zu verschieben, aber ich fügte auch eine direkte Kopie alle (Strg+Umschalt+C), die nicht einmal die Mühe, die Elemente vor dem Kopieren auswählen.

private static void HandleListBoxKeyEvents(object sender, KeyEventArgs e)
{
    var lb = sender as ListBox;
    // if copy
    if (e.Control && e.KeyCode == Keys.C)
    {
        // if shift is also down, copy everything!
        var itemstocopy = e.Shift ? lb.Items.Cast<object>() : lb.SelectedItems.Cast<object>();
        // build clipboard buffer
        var copy_buffer = new StringBuilder();
        foreach (object item in itemstocopy)
            copy_buffer.AppendLine(item?.ToString());
        if (copy_buffer.Length > 0)
            Clipboard.SetText(copy_buffer.ToString());
    }
    // if select all
    else if (e.Control && e.KeyCode == Keys.A)
    {
        lb.BeginUpdate();
        for (var i = 0; i < lb.Items.Count; i++)
            lb.SetSelected(i, true);
        lb.EndUpdate();
    }
}

0voto

doomi Punkte 51

Dies ist absolut nicht schön, aber viel schneller als eine Schleife, wenn Sie viele viele (100+) Elemente haben: Wählen Sie die Listbox und simulieren Sie die Tasteneingabe von [home] und [shift]+[end]

lb.BeginUpdate();
lb.Select();
SendKeys.Send("{Home}");
SendKeys.Send("+{End}");
lb.EndUpdate();

EDIT: funktioniert nur mit SelectionMode.MultiExtended, denke ich

DoubleEDit: Beachten Sie auch, dass dies für Code, der anschließend mit lb.selecteditems ausgeführt wird, zu langsam sein könnte, aber es kann für eine [Select All]-Schaltfläche, auf die der Benutzer klickt, nützlich sein.

0 Stimmen

Funktioniert bei mir nicht (ich verwende .Net 4.7). Die Listbox blinkt nur und das war's.

0voto

jfatal Punkte 245

Alle auswählen ist auf jeden Fall sofort verfügbar:

$("#ListBoxID option").prop("selected", true);

3 Stimmen

Die Frage bezieht sich auf Winforms, nicht auf Web

0 Stimmen

Auch dieser Code ist nicht "out of the box". Der aufgeführte Code ist jQuery und nicht C#/VB.NET

0 Stimmen

Die Antwort ist eine angemessene Lösung für das Problem!

0voto

fujiiface Punkte 1162

Ich weiß, dass diese Frage mit .NET 2.0 getaggt ist, aber wenn Sie LINQ in 3.5+ zur Verfügung haben, können Sie das folgende tun:

ASP.NET WebForms

var selected = listBox.Items.Cast<System.Web.UI.WebControls.ListItem>().All(i => i.Selected = true);

WinForms

var selected = listBox.SelectedItems.Cast<int>().ToArray();

0 Stimmen

Nein - ich erhalte The type or name ListItem could not be found. (Fehlt eine Using-Anweisung oder eine Assembly-Referenz).

0 Stimmen

Es scheint ein wenig übertrieben, die Lösung abzuwerten, anstatt mit der Person herauszufinden, warum die Lösung für Sie nicht funktioniert. Haben Sie die erwähnte fehlende Using-Anweisung using System.Web.UI.WebControls; ? Antwort aktualisiert, um die Baugruppe zu referenzieren.

0 Stimmen

Entschuldigung fujiface - ich habe dich wieder hochgestuft. Ich dachte zunächst, du hättest deinen Beitrag bereits 2014 geschrieben, also hatte ich keine Antwort erwartet. Ich kann nicht scheinen, um System.Web.UI.WebControls zugreifen. Alles, was ich sehen kann, ist System.Web. Und ich habe versucht, einen Verweis darauf hinzuzufügen, aber er wird auch dort nicht angezeigt. Vielleicht wurde es in 4.7 veraltet? Ich habe nach einem NuGet-Paket mit diesem Namen gesucht und das ist auch nicht da.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X