Avatar billede burningice Nybegynder
14. januar 2003 - 22:41 Der er 2 kommentarer og
1 løsning

ItemChecked eventen

Jeg har to checkedlistbox'es på en form, hvor den ene indeholder en liste over borde, og den anden tilhørende stole til det valgte bord... det er nu meningen at når man krydser et bord af, så skal alle stolene krydses af, og lige så når man "afkrydser" et bord, skal alle stolene "afkrydses"... til dette har jeg lavet dette lille stykke kode, og umiddelbart virker det fint. Der er dog den lille hage ved det, og det er, at selvom koden til at checke et item af med, bliver kørt, så forbliver den unchecked på selve formen :(

private void clbTables_ItemCheck(object sender, System.Windows.Forms.ItemCheckEventArgs e)
        {
            if (e.NewValue == CheckState.Checked)
            {
                for (int i = 0; i < clbStole.Items.Count; i++)
                {
                    if (clbStole.GetItemCheckState(i) == CheckState.Unchecked)
                    {
                        clbStole.SetItemCheckState(i, CheckState.Checked);
                    }
                }
            }
            else if (e.NewValue == CheckState.Unchecked)
            {
                for (int i = 0; i < clbStole.Items.Count; i++)
                {
                    if (clbStole.GetItemCheckState(i) == CheckState.Checked)
                    {
                        clbStole.SetItemCheckState(i, CheckState.Unchecked);
                    }
                }                             
            }
        }
Avatar billede burningice Nybegynder
14. januar 2003 - 22:44 #1
det skal dog lige siges, at ca. hver 10ende gang, så bliver alle stolene til et bord krydset af, ved at krydse bordet af... men det er jo ikke særlig fedt :(
Avatar billede burningice Nybegynder
14. januar 2003 - 22:45 #2
og til allersidst... kan jeg også sige, at koden for ItemCheck nogen gange slet ikke BLIVER kørt... det er specielt når man bruger tastaturet og spacebar til at krydse af med, istedet for musen... :( det er rigtig meget øv det hele
Avatar billede burningice Nybegynder
21. januar 2003 - 20:58 #3
mon ikke jeg lige skulle lukke her... jeg har fået løst problemet, og lært en hel masse om CheckedListBox'es og ItemCheck eventen, så intet er så skidt det ikke er godt for noget...

Hemmeligheden lå i SuspendLayout() og Update() som skulle kaldes henholdsvis før, og efter jeg begyndte at checke items af i clbStole. Samtidig skulle jeg sørge for at disable ItemCheck eventen på i clbStole.ItemCheck eventen mens koden kører igennem, ellers vil der opstå loop.

        private void clbTables_ItemCheck(object sender, System.Windows.Forms.ItemCheckEventArgs e)
        {
            clbStole.SuspendLayout();
           
            if (e.NewValue == CheckState.Checked)
            {
                for (int i = 0; i < clbStole.Items.Count; i++)
                {
                    if (clbStole.GetItemCheckState(i) == CheckState.Unchecked)
                    {
                        clbStole.SetItemCheckState(i, CheckState.Checked);
                    }
                }
            }
            else
            {
                for (int i = 0; i < clbStole.Items.Count; i++)
                {
                    if (clbStole.GetItemCheckState(i) == CheckState.Checked)
                    {
                        clbStole.SetItemCheckState(i, CheckState.Unchecked);
                    }
                }
            }
   
            clbStole.Update();
        }

        private void clbStole_ItemCheck(object sender, System.Windows.Forms.ItemCheckEventArgs e)
        {
            clbTables.ItemCheck -= new System.Windows.Forms.ItemCheckEventHandler(clbTables_ItemCheck);

            string str = clbTables.SelectedValue.ToString() +"."+ clbStole.GetItemText(clbStole.Items[e.Index]);

            if (e.NewValue == CheckState.Checked)
            {
                if (!arrStole.Contains(str))
                {
                    arrStole.Add(str);
                    if (clbStole.GetItemCheckState(clbTables.SelectedIndex) == CheckState.Unchecked)
                    {
                        clbTables.SetItemCheckState(clbTables.SelectedIndex, CheckState.Checked);
                    }
                }
            }
            else if (e.NewValue == CheckState.Unchecked)
            {
                arrStole.Remove(str);
                if (clbStole.CheckedItems.Count-1 == 0)
                {
                    clbTables.SetItemCheckState(clbTables.SelectedIndex, CheckState.Unchecked);
                }
            }

            this.textBox1.Text = arrStole.Count.ToString();

            clbTables.ItemCheck += new System.Windows.Forms.ItemCheckEventHandler(clbTables_ItemCheck);
        }
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester