[.NET] ItemChecked event word bij het toevoegen aangeroepen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • ThaStealth
  • Registratie: Oktober 2004
  • Laatst online: 11-09 10:19
Hoi,

Ik heb een listview met checkboxes, de listview is op details ingesteld.

Wanneer ik een item toevoeg aan de listview dan wordt het ItemChecked event aangeroepen (ook al doe ik niets met aan de checkstate veranderen. Voor 20 items zou me dit weinig uitmaken, echter is het de bedoeling dat deze listview 1000++ items gaat krijgen en dit event vertraagt de boel behoorlijk.

Hierbij de code die ik geschreven heb:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        private void UpdateOverview(string filter)
        {
            this.listView1.ItemChecked -= this.listView1_ItemChecked;
            listView1.ListViewItemSorter = null;
            List<devices> devices= _serverMonitor.GetDevices(filter);
            List<int> devices= new List<int>();
            for(int i = 0 ; i < listView1.CheckedItems.Count;i++)
            {
                selectedDBs.Add(Convert.ToInt32(listView1.CheckedItems[i].SubItems[1].Text)); //subitem = DBID
            }
            listView1.Items.Clear();
            for (int i = 0; i < devices.Count; i++)
            {               
                    ListViewItem recData = new ListViewItem();
                    recData.Checked = selectedDBs.Contains(devices[i].DBID); // als het ding van te voren al gechecked was wederom checken
                    
                    //..subitems toevoegen..

                    listView1.Items.Add(recData);                
            }
            this.listView1.ItemChecked += this.listView1_ItemChecked;          
            listView1.ListViewItemSorter = lvwColumnSorter;
        }


Dit gebeurt alleen de eerste keer dat de items toegevoegd worden. Erna gebeurd het niet meer

Mess with the best, die like the rest


Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Wat denk je ervan om eens een breakpoint te zetten in je ItemChecked handler en op zo'n moment de callstack eens te bekijken?

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Ehm, je hebt dit probleem toch opgelost door de eventhandler weg te halen? Verder even wat testcode:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
            this.listView1.ItemChecked -= this.listView1_ItemChecked;
            listView1.CheckBoxes = false;
            var s = Stopwatch.StartNew();
            // listView1.BeginUpdate();
            for (int i = 0; i < 1000; i++)
            {
                var recData = new ListViewItem(i.ToString());
                recData.Checked = true;
                listView1.Items.Add(recData);
            }
            // listView1.EndUpdate();
            MessageBox.Show(String.Format("{0} {1}",s.ElapsedMilliseconds,
                listView1.Items.Count));
            s = Stopwatch.StartNew();
            listView1.Items.AddRange(
                Enumerable.Range(0, 1000)
                .Select(a => new ListViewItem(a.ToString()) { Checked = true })
                .ToArray());
            MessageBox.Show(String.Format("{0} {1}",s.ElapsedMilliseconds,
                listView1.Items.Count));

Wat valt hier op?
Zonder Begin/EndUpdate() en met Checkboxes uit loopt een ListView een soort trauma op, waardoor zelfs AddRange() steeds lastiger gaat, totdat Clear() wordt aangeroepen. Met Checkboxes aan gebeurd dit laatste vreemd genoeg niet. In alle gevallen is AddRange() sneller.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • ThaStealth
  • Registratie: Oktober 2004
  • Laatst online: 11-09 10:19
H!GHGuY schreef op dinsdag 24 november 2009 @ 17:50:
Wat denk je ervan om eens een breakpoint te zetten in je ItemChecked handler en op zo'n moment de callstack eens te bekijken?
Callstack is niets bijzonders, alleen de eventhandler + external code. Ik hebv voor de zekerheid nog gecontrolleerd, maar ik roep het event niet 1000x aan in een loopje
pedorus schreef op dinsdag 24 november 2009 @ 18:43:
Ehm, je hebt dit probleem toch opgelost door de eventhandler weg te halen? Verder even wat testcode:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
            this.listView1.ItemChecked -= this.listView1_ItemChecked;
            listView1.CheckBoxes = false;
            var s = Stopwatch.StartNew();
            // listView1.BeginUpdate();
            for (int i = 0; i < 1000; i++)
            {
                var recData = new ListViewItem(i.ToString());
                recData.Checked = true;
                listView1.Items.Add(recData);
            }
            // listView1.EndUpdate();
            MessageBox.Show(String.Format("{0} {1}",s.ElapsedMilliseconds,
                listView1.Items.Count));
            s = Stopwatch.StartNew();
            listView1.Items.AddRange(
                Enumerable.Range(0, 1000)
                .Select(a => new ListViewItem(a.ToString()) { Checked = true })
                .ToArray());
            MessageBox.Show(String.Format("{0} {1}",s.ElapsedMilliseconds,
                listView1.Items.Count));

Wat valt hier op?
Zonder Begin/EndUpdate() en met Checkboxes uit loopt een ListView een soort trauma op, waardoor zelfs AddRange() steeds lastiger gaat, totdat Clear() wordt aangeroepen. Met Checkboxes aan gebeurd dit laatste vreemd genoeg niet. In alle gevallen is AddRange() sneller.
Ik dacht ook dat het probleem opgelost zou zijn zodra ik de events eruit gooide totdat de update compleet was. Nadat ik het event terugzet (wat je btw niet doet in de code) treden de 1000 events pas op...

Wat me wel opvalt is dat het alleen gebeurd als ik de listview vanuit de constructor vul, als ik dit naderhand doe (dus onload event, of via een button) heb ik het probleem neit.

Zou het een bug kunnen zijn in het component?

Mess with the best, die like the rest


Acties:
  • 0 Henk 'm!

  • ThaStealth
  • Registratie: Oktober 2004
  • Laatst online: 11-09 10:19
Heb het inmiddels opgelost door niet meer via de constructor de lijst te vullen maar dit mbv een timer event op te lossen nu treed het probleem niet op

Mess with the best, die like the rest


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

ThaStealth schreef op dinsdag 08 december 2009 @ 20:04:
Heb het inmiddels opgelost door niet meer via de constructor de lijst te vullen maar dit mbv een timer event op te lossen nu treed het probleem niet op
Waarom niet aanmaken, renderen, en dan pas het event afhandelen?

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • ThaStealth
  • Registratie: Oktober 2004
  • Laatst online: 11-09 10:19
Snake schreef op dinsdag 08 december 2009 @ 20:07:
[...]

Waarom niet aanmaken, renderen, en dan pas het event afhandelen?
Crap, je hebt gelijk, zo had ik het ook opgelost, ik heb het in de Form_Shown event toegevoegd. De timer heb ik voor iets anders gebruikt (het refreshen). :o

Mess with the best, die like the rest

Pagina: 1