Sie können das ItemCheck
Ereignis verwenden, wenn Sie auch den neuen Status des Elements überprüfen, auf das geklickt wird. Dies ist in den Ereignisargumenten als verfügbar e.NewValue
. Wenn diese NewValue
Option aktiviert ist, fügen Sie das aktuelle Element zusammen mit der eigentlichen Sammlung in Ihre Logik ein:
private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
List<string> checkedItems = new List<string>();
foreach (var item in checkedListBox1.CheckedItems)
checkedItems.Add(item.ToString());
if (e.NewValue == CheckState.Checked)
checkedItems.Add(checkedListBox1.Items[e.Index].ToString());
else
checkedItems.Remove(checkedListBox1.Items[e.Index].ToString());
foreach (string item in checkedItems)
{
...
}
}
Als weiteres Beispiel, um festzustellen, ob die Sammlung leer ist, nachdem dieses Element (nicht) aktiviert wurde:
private void ListProjects_ItemCheck(object sender, ItemCheckEventArgs args)
{
if (ListProjects.CheckedItems.Count == 1 && args.NewValue == CheckState.Unchecked)
// The collection is about to be emptied: there's just one item checked, and it's being unchecked at this moment
...
else
// The collection will not be empty once this click is handled
...
}
if not item = checkedListBox1.Items[e.Index].ToString()
Es gibt viele verwandte StackOverflow-Beiträge zu diesem Thema ... Neben der Lösung von Branimir gibt es hier zwei weitere einfache:
Verzögerte Ausführung bei ItemCheck (auch hier ):
Verwenden des MouseUp-Ereignisses :
Ich bevorzuge die erste Option, da die zweite zu Fehlalarmen führen würde (dh zu oft feuern).
quelle
The check state is not updated until after the ItemCheck event occurs
. Ein anderes Ereignis oder eine nicht willkürliche Problemumgehung wäre nett, IMO.Ich habe es versucht und es hat funktioniert:
quelle
ItemChecked
Ereignis zu implementieren , und niemand jemals angesprochen hat, dass es nicht existiert.ItemChecking
,ItemChecked
könnten Sie das letztere verwenden. Wenn jedoch nur eines implementiert ist (ItemCheck
), werden die Dinge korrekt ausgeführt, dh das Ereignis wird ausgelöst, bevor der Wert mit einem neuen Wert und einem neuen Index als Parameter überprüft wird. Wer das "After Change" -Ereignis möchte, kann einfach das oben genannte verwenden. Wenn Sie Microsoft etwas vorschlagen, dann schlagen Sie ein neues Ereignis vorItemChecked
, ohne das bestehende zu ändern: siehe die Antwort vonAbleiten von
CheckedListBox
und implementierenquelle
Obwohl dies nicht ideal ist, können Sie die CheckedItems mithilfe der Argumente berechnen, die an das
ItemCheck
Ereignis übergeben werden. Wenn Sie sich dieses Beispiel auf MSDN ansehen , können Sie herausfinden, ob das neu geänderte Element aktiviert oder deaktiviert wurde, sodass Sie in einer geeigneten Position sind, um mit den Elementen zu arbeiten.Sie können sogar ein neues Ereignis erstellen, das ausgelöst wird, nachdem ein Element überprüft wurde. Dadurch erhalten Sie genau das, was Sie möchten, wenn Sie dies wünschen.
quelle
Nach einigen Tests konnte ich feststellen, dass das Ereignis SelectedIndexChanged nach dem Ereignis ItemCheck ausgelöst wird. Behalten Sie die Eigenschaft CheckOnClick True bei
Beste Codierung
quelle
Dies funktioniert, nicht sicher, wie elegant es ist!
quelle
Ich weiß nicht, ob dies zutrifft, aber ich wollte ein Kontrollkästchen verwenden, um die Ergebnisse zu filtern. Da der Benutzer Elemente aktiviert und deaktiviert hat, sollte die Liste Elemente anzeigen / ausblenden.
Ich hatte einige Probleme, die mich zu diesem Beitrag führten. Ich wollte nur erzählen, wie ich es ohne etwas Besonderes gemacht habe.
Hinweis: Ich habe CheckOnClick = true, aber ohne würde es wahrscheinlich immer noch funktionieren
Das von mir verwendete Ereignis ist " SelectedIndexChanged ".
Die von mir verwendete Aufzählung lautet " .CheckedItems ".
Dies gibt die Ergebnisse, von denen ich denke, dass wir sie erwarten können. So vereinfacht kommt es darauf an ...
quelle
Angenommen, Sie möchten die Argumente beibehalten, werden
ItemCheck
aber benachrichtigt, nachdem das Modell geändert wurde, sollte dies folgendermaßen aussehen:Wo
CheckedItemsChanged
könnte sein:quelle
Ich benutze einen Timer, um dieses Problem zu lösen. Aktivieren Sie den Timer über das ItemCheck-Ereignis. Ergreifen Sie Maßnahmen beim Timer's Tick-Event.
Dies funktioniert unabhängig davon, ob das Element per Mausklick oder durch Drücken der Leertaste überprüft wird. Wir werden die Tatsache ausnutzen, dass der gerade aktivierte (oder nicht aktivierte) Artikel immer der ausgewählte Artikel ist.
Das Intervall des Timers kann so niedrig wie 1 sein. Wenn das Tick-Ereignis ausgelöst wird, wird der neue Status "Überprüft" gesetzt.
Dieser VB.NET-Code zeigt das Konzept. Es gibt viele Variationen, die Sie verwenden können. Möglicherweise möchten Sie das Intervall des Timers erhöhen, damit der Benutzer den Prüfstatus für mehrere Elemente ändern kann, bevor er Maßnahmen ergreift. Führen Sie dann im Tick-Ereignis einen sequentiellen Durchlauf aller Elemente in der Liste durch, oder verwenden Sie die CheckedItems-Auflistung, um entsprechende Maßnahmen zu ergreifen.
Aus diesem Grund deaktivieren wir zuerst den Timer im ItemCheck-Ereignis. Deaktivieren und dann aktivieren bewirkt, dass die Intervallperiode neu gestartet wird.
quelle
Wenn wir bei normalem Verhalten ein Element überprüfen, ändert sich der Überprüfungsstatus des Elements, bevor der Ereignishandler ausgelöst wird. Eine CheckListBox hat jedoch ein anderes Verhalten: Der Ereignishandler wird ausgelöst, bevor sich der Prüfstatus des Elements ändert, und dies macht es schwierig, unsere Jobs zu korrigieren.
Um dieses Problem zu lösen, sollten wir meiner Meinung nach den Event-Handler verschieben.
quelle
Ich habe es versucht und es hat funktioniert:
Bestimmen Sie anhand des Index der Liste.
quelle