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?

75voto

Mehdi LAMRANI Punkte 10973

Tatsache ist, dass ListBox.Items ist eine einfache Objektsammlung und gibt einfache, nicht typisierte Objekte zurück, die (standardmäßig) nicht mehrfach ausgewählt werden können.

Wenn Sie eine Mehrfachauswahl aller Elemente treffen möchten, funktioniert dies:

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

0 Stimmen

Angenommen, diese Logik ist an eine Tastenkombination gebunden (z. B. Strg+A), die in einem KeyDown-Ereignis behandelt wird, müssen Sie auch sicherstellen, dass e.SuppressKeyPress = true ist; andernfalls wird Ihre Auswahl auf das erste "A" in der Liste zurückgesetzt.

0 Stimmen

Bei großen Listen sollte man die Aktualisierung aussetzen. stackoverflow.com/q/15398091/340790

9voto

EricLaw Punkte 55641

Soweit ich das beurteilen kann, ist die Verwendung einer der .NET-Methoden zur Auswahl einer großen Anzahl von Elementen weitaus langsamer als ein direkter PInvoke-Aufruf, bei dem die LB_SETSEL-Nachricht (0x185) an das Steuerelement übergeben wird, mit einem Flag, das angibt, ob Sie auswählen (1) oder die Auswahl aufheben (0) wollen, sowie dem magischen Wert (-1), der angibt, dass die Änderung für alle Elemente gelten soll.

  [DllImport("user32.dll", EntryPoint = "SendMessage")]
  internal static extern IntPtr SendMessage(IntPtr hWnd, UInt32 msg, IntPtr wParam, IntPtr lParam);

  // Select All
  SendMessage(listBox.Handle, 0x185, (IntPtr)1, (IntPtr)(-1));

  // Unselect All
  SendMessage(listBox.Handle, 0x185, (IntPtr)0, (IntPtr)(-1));

0 Stimmen

Netter Versuch. Es werden wirklich alle Elemente ausgewählt, aber die Aufzählung der Elemente schlägt fehl. Das Problem ist, dass nach SendMessage, um alle Elemente auszuwählen, bekomme ich SelectedItems.Count zeigt die Anzahl aller Listbox-Elemente (das ist richtig). Aber wenn ich versuche, SelectedItems aufzulisten, wird nur eine Iteration durchgeführt. Wenn ich ausführe SelectedItems[SelectedItems.Count - 1] Die Ausnahme IndexOutOfRange wird ausgelöst. Es scheint, dass Elemente ausgewählt sind, aber das Listenfeld aktualisiert die inneren Listen nicht mit ihnen. Zum Berechnen SelectedObjectCollection.Count sendet eine weitere Fensternachricht, die die Anzahl aller Elemente zurückgibt.

0 Stimmen

Die -1 ist nicht so magisch, siehe LB_SETSEL-Meldung (Windows) . BTW: Es funktioniert gut mit der VCL-Klasse TListBox.

0 Stimmen

Hallo, @Wolf. Der Begriff "Magie" hat in der Programmierung eine besondere Bedeutung; siehe de.wikipedia.org/wiki/Magische_Zahl_(Programmierung)

9voto

nawfal Punkte 65966

Ich habe eine Reihe von (ähnlichen) Antworten gesehen, die alle logischerweise das Gleiche tun, und ich war verblüfft, warum sie bei mir nicht funktionieren. Der Schlüssel ist die Einstellung der Listboxen SelectionMode a SelectionMode.MultiSimple . Es funktioniert nicht mit SelectionMode.MultiExtended . Wenn Sie mehrere Elemente in einem Listenfeld auswählen möchten, müssen Sie den Auswahlmodus auf den Mehrfachmodus einstellen, und die meisten Leute entscheiden sich für den herkömmlichen MultiExtended Stil, sollte diese Antwort eine große Hilfe sein. Und ya nicht ein foreach aber for .

Sie sollten dies tatsächlich tun:

lb.SelectionMode = SelectionMode.MultiSimple;
for (int i = 0; i < lb.Items.Count; i++)
    lb.SetSelected(i, true);
lb.SelectionMode = //back to what you want

O

lb.SelectionMode = SelectionMode.MultiSimple;
for (int i = 0; i < lb.Items.Count; i++)
    lb.SelectedIndices.Add(i);
lb.SelectionMode = //back to what you want

2 Stimmen

Wenn Sie Folgendes hinzufügen e.SuppressKeyPress = true; sollte es funktionieren, unabhängig vom SelectionMode.

4voto

Joey Punkte 329386

Ich glaube, man muss hier eine Schleife machen. Die Auswahl aller Elemente auf einmal ist ein ziemlich spezifischer (und wahrscheinlich seltener) Anwendungsfall, bei dem es einfach keinen Sinn macht, diese Funktionalität von Haus aus anzubieten. Außerdem besteht die Schleife ohnehin nur aus zwei Codezeilen.

2voto

In diesem Constructor müssen Sie den Mehrfachauswahlmodus aktivieren ( MultiExtended ) des gewünschten Textfeldes.

public Form1()
{
    InitializeComponent();
    listBox1.SelectionMode = SelectionMode.MultiExtended;
    listBox2.SelectionMode = SelectionMode.MultiExtended;
}

Verwenden Sie anschließend eine Schleife, um alles auszuwählen:

private void selectAll_Click(object sender, EventArgs e)
{
    for (int val = 0; val < listBox1.Items.Count; val++)
    {
        listBox1.SetSelected(val, true);
    }
}

Ich habe es getestet. Es funktioniert. Sie können auch die [CTRL/SHIFT]-Taste + Linksklick um die Elemente einzeln auszuwählen.

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