Laden...

CheckedListBox: check items Steuerung und Auswertung

Erstellt von Gofruun vor 10 Jahren Letzter Beitrag vor 10 Jahren 2.076 Views
G
Gofruun Themenstarter:in
2 Beiträge seit 2013
vor 10 Jahren
CheckedListBox: check items Steuerung und Auswertung

Guten Abend,

Ich möchte einen Filter mit einer CheckedListBox erstellen, welcher sich ähnlich verhält wie die Filter Funktion in Excel.
Beispiel Items:

  • (alle auswählen)
  • Maus
  • Katze
  • Hund

Das Item (alle auswählen) soll den Status Checked haben, wenn die Items Maus, Katze und Hund den Status Cheked haben.
Hat jedoch ein Item (Maus, Katze oder Hund den Status Unchecked, muss der Status vom (alle auswählen) Unchecked sein.
Ist der Status von (alle auswählen) == Unchecked und der User Clickt auf das Item müssen alle items den Status Checked erhalten.
Ist der Status von (alle auswählen) == Checked und der User Clickt auf das Item müssen alle items den Status Unchecked erhalten.

Folgende Probleme haben sich ergeben:

Während dem Aufruf des Events ItemCheck ist der Status von der CheckedListBox noch nicht aktualisiert. Dieses Problem konnte ich lösen mit der Methode BeginInvoke (Erst nach der Verarbeitung der Events wird die aufgerufene Methode ausgeführt -> Statusinformationen I.O.)

Nun habe ich jedoch das Problem, dass bei jeder Änderung vom Status das Event ItemCheck wieder aufgerufen wird. Gibt es eine Möglichkeit, den Status zu ändern, ohne das das Event ItemCheck wieder aufgerufen wird?
Gibt es vielleicht eine bestehende Lösung für diese Aufgabenstellung?

Besten Dank für die Hilfe

Hier ist mein Code, der eben nicht funktioniert, weil das Event ItemCheck immer wieder aufgerufen wird.


private void eventFilter_ItemCheck(object sender, ItemCheckEventArgs e)
{
    if (e.Index == 0)
    {
       switch (e.NewValue)
      {
         case CheckState.Checked:
           for (int index = 1; index < eventFilter.Items.Count; index++)
          {
             eventFilter.SetItemCheckState(index, CheckState.Checked);
          }
          return;
        case CheckState.Unchecked:
          for (int index = 1; index < eventFilter.Items.Count; index++)
         {
            eventFilter.SetItemCheckState(index, CheckState.Unchecked);
         }
         return;
      }
      return;
    }
    BeginInvoke((MethodInvoker)delegate { CheckStatusEventFilter(); });
}

private void CheckStatusEventFilter()
{
    int nrOfChecked = 0;
    int nrOfUnchecked = 0;
			
    for (int index = 1; index < eventFilter.Items.Count; index++)
   {
      var checkState = eventFilter.GetItemCheckState(index);
      switch (checkState)
     {
        case CheckState.Checked:
          nrOfChecked += 1;
          break;
        case CheckState.Unchecked:
          nrOfUnchecked += 1;
          break;
      }
    }
    if (nrOfChecked > 0)
    {
       eventFilter.SetItemCheckState(0, CheckState.Unchecked);
       return;
    }
    if (nrOfUnchecked == 0)
    {
       eventFilter.SetItemCheckState(0, CheckState.Checked);
    }			
}


49.485 Beiträge seit 2005
vor 10 Jahren

Hallo Gofruun,

die Sache mit dem Control.BeginInvoke, die du verwendet hast, steht in der FAQ [FAQ] Bestimmte Aktionen bis nach der laufenden GUI-Event-Behandlung verzögern. Und der Teil, der dir noch fehlt, auch: [FAQ] Event nur bei Benutzeraktion auslösen, nicht bei programmtechnischer Änderung.

herbivore

G
Gofruun Themenstarter:in
2 Beiträge seit 2013
vor 10 Jahren

Hallo Herbivore

Vielen Dank für Deine schnelle Antwort. Ich habe die Links zur Gemüte genommen. Eigentlich sind die Titel der Themen in FAQ sehr selbstsprechend. Und trotzdem bin ich nicht auf diese gestossen… 🙁
Da ich ein Umsteiger auf c# .NET bin, sind mir die üblichen angewendeten Techniken noch nicht bekannt. Darum stelle ich die Fragen:
Muss man wirklich diese Handstände machen um das Problem zu lösen oder versuche ich das Rad neu zu erfinden?
Sind diese Handstände keine Handstände sondern eben übliche Vorgehensweisen?

Besten Dank

Gofruun

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo Gofruun,

ob die Techniken im konkreten Fall nötig sind, kann ich nicht garantieren. Aber wenn es mit ihnen aber geht, ohne sie aber nicht, spricht einiges dafür, dass die nötig sind. 😃

Dass sie üblich sind, sieht man eigentlich schon daran, dass sie (schon seit längerem und unwidersprochen) in der FAQ stehen.

herbivore

4.221 Beiträge seit 2005
vor 10 Jahren

Hier nur noch eine viel einfachere Möglichkeit:


        private bool _InItemCheckEvent = false;
        void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
        {
            if (this._InItemCheckEvent)
            {
                return;
            }
            this._InItemCheckEvent = true;
            bool blnChecked = (e.NewValue == CheckState.Checked);
            if (e.Index == 0) //Alle
            {
                for (int i=1;i<this.checkedListBox1.Items.Count;i++)
                { 
                    this.checkedListBox1.SetItemChecked(i,blnChecked);
                }
            }
            else
            {
                if (blnChecked)
                {
                    this.checkedListBox1.SetItemChecked(0, this.checkedListBox1.CheckedItems.Count == this.checkedListBox1.Items.Count - 2);
                }
                else
                {
                    this.checkedListBox1.SetItemChecked(0, this.checkedListBox1.Items.Count-this.checkedListBox1.CheckedItems.Count == 1);
                }
            }
            this._InItemCheckEvent = false;
        }

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...