Laden...

CheckedListBox Alle Auswählen

Erstellt von Lankabel vor 14 Jahren Letzter Beitrag vor 14 Jahren 2.124 Views
L
Lankabel Themenstarter:in
19 Beiträge seit 2008
vor 14 Jahren
CheckedListBox Alle Auswählen

Hallo,
Ich bin noch nicht so erfrahren was Windows-Forms Anwendungen betriff und ich habe folgendes Problem. Ich habe eine CheckedListBox mit vielen Einträgen, nun habe ich in dieser CheckedListBox einen Eintrag namens "Alle". Nun möchte ich wenn "Alle" angehakt wird alle gegenstände dieser Liste auswählen. Nun so sieht mein Code aus es tritt immer einen StackOverflow. Ich weiß auch warum aber ich weiß nicht wie ich dies anders Lösen sollen und bitte nun um hilfe.



        private void chkBoxList_ItemCheck(object sender, ItemCheckEventArgs e)
        {
            //Wenn alle gewählt wird dann checke alle an
            if (((ListControl)sender).Text == "Alle")
            {
                //Alle anhaken / oder nicht
                this.toogleCheckBoxItems(this.chkBoxList, (e.CurrentValue != CheckState.Checked));
            }
            else
            {
                //Wenn etwas anderes gewählt wurde haken von "Alle" entfehrnen
                this.chkBoxList.SetItemChecked(0, false);
            }
        }

        private void toogleCheckBoxItems(CheckedListBox chkList, bool isChecked)
        {
            //Den ersten können wir überspringen
            for (int i = 1; i < chkList.Items.Count; i++)
            {
                chkList.SetItemChecked(i, isChecked);
            }
        }

M
205 Beiträge seit 2008
vor 14 Jahren

Hallo,

du hast dich bei deinem Code zweimal in eine Rekursion verlaufen. Das erste mal wegen eines fehlers da du in der Zeile


((ListControl)sender).Text == "Alle"

prüfst ob der erste Eintrag "Alle" in der Texteigenschaft stehen hat, was ja immer der Fall ist...

Schöner ist meiner Meinung das ganze wenn du ein eigenes Control erstellst was genau diese Funktionalität bereitstellt. Habs mir mal angetan:


    public class SpecialCheckedListBox : CheckedListBox
    {
        private bool InternSelectionProcess;

        public SpecialCheckedListBox()
        {
            InternSelectionProcess = false;

            this.Items.Clear ();
            this.Items.Add ( "Alle" );
        }

        public void SelectAll ()
        {
            this.SelectionProcessToAll ( CheckState.Checked );
        }

        public void DeselectAll ()
        {
            this.SelectionProcessToAll ( CheckState.Unchecked );
        }

        protected void SelectionProcessToAll ( CheckState State )
        {
            InternSelectionProcess = true;
            for ( int i = 0; i < base.Items.Count; i++ )
            {
                base.SetItemCheckState ( i , State );
            }
            InternSelectionProcess = false;
        }

        protected override void OnItemCheck ( ItemCheckEventArgs ice )
        {
            if ( !InternSelectionProcess )
            {
                base.OnItemCheck ( ice );

                if ( this.Items [ice.Index] as string == "Alle" )
                {
                    if ( ice.NewValue == CheckState.Checked )
                    {
                        this.SelectAll ();
                    }
                    else if ( ice.NewValue == CheckState.Unchecked )
                    {
                        this.DeselectAll ();
                    }
                }
                else
                {
                    this.InternSelectionProcess = true;
                    this.SetItemCheckState ( 0 , CheckState.Unchecked );
                    this.InternSelectionProcess = false;
                }
            }
        }
    }

Der erste Eintrag "Alle" wird beim Ausführen des Programms hinzugefügt...
mfg Markus

L
Lankabel Themenstarter:in
19 Beiträge seit 2008
vor 14 Jahren

Vielen dank!