[c# .NET] ListView.SelectedIndexCollection "verliest" inhoud

Pagina: 1
Acties:

  • mahi
  • Registratie: Juni 2001
  • Laatst online: 03-10-2025

mahi

God bless GoT

Topicstarter
Ik heb een vreemd probleem met ListView.SelectedIndexCollection... Even kort uitleggen wat ik wil doen: Ik heb een ListView control met meerdere mogelijke selecties. Bij een bepaalde actie wordt de hele ListView ververst. Nu zou ik voor die actie de op dat moment geselecteerde indices willen bewaren en na het verversen van de lijst die selecties weer terugzetten. Eenvoudig denk je? En ja, dat is het ook. Maar de meest eenvoudige vorm wil niet werken en ik begrijp niet waarom.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
// Bewaar huidige selectie
ListView.SelectedIndexCollection sic = this.listView.SelectedIndices;

//
// Ververs listView
//

// Zet de selectie terug
foreach (int index in sic)
{
    this.listView.Items[index].Selected = true;
}
Na verversen is geen enkele regel geselecteerd, ongeacht de begintoestand. De code komt gewoonweg nooit binnenin de foreach lus achter het verversen. Dat begrijp ik dus niet. Wanneer ik echter de SelectedIndexCollection opsla in een ArrayList zoals in onderstaand voorbeeld dan werkt het wel:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Bewaar huidige selectie
ListView.SelectedIndexCollection sic = this.listView.SelectedIndices;

// Zet de indices uit de SelectedIndexCollection in een ArrayList
ArrayList array_sic = new ArrayList();
foreach (int index in sic)
{
    array_sic.Add(index);
}

//
// Ververs listView
//

// Zet de selectie terug
foreach (int index in array_sic)
{
    this.listView.Items[index].Selected = true;
}
Zo werkt het dus, maar dat opslaan in de ArrayList lijkt mij een nutteloze tussenstap. Het zou toch ook rechtstreeks met de SelectedIndexCollection moeten werken? Ik sla de SelectedIndexCollection toch op in een nieuwe variabele vóór ik de lijst leegmaak en terug vul. Er is dan (denk ik) toch geen verband meer tussen de variabele sic en de ListView. En toch wordt sic blijkbaar leeggemaakt wanneer ik m'n lijst leegmaak en weer vul. Het is logisch dat de SelectedIndices property van de ListView wanneer de lijst leeggemaakt wordt ook leeggemaakt wordt. Maar waarom een (in mijn ogen) losstaande variabele ook leeggemaakt wordt, dat snap ik niet? Als ik een integer variabele A met waarde 5 opsla in een nieuwe integer variabele B en daarna A 0 maak, dan is B toch ook niet ineens 0? Misschien bekijk ik het verkeerd?

Kan iemand dit SelectedIndexCollection verschijnsel toelichten?

A bus station is where a bus stops. A train station is where a train stops... On my desk I have a workstation.


  • whoami
  • Registratie: December 2000
  • Laatst online: 20:38
Eén woord: reference type. (2 eigenlijk :) )

In je eerste voorbeeld maak je geen nieuwe SelectedIndexCollection. Je maakt gewoon een SelectedIndexCollection die wijst naar dezelfde collectie die de member is van je listview. Als je de Items dus van je ListView dus cleart, heeft de SelectedIndexCollection van je listview geen inhoud meer. De SelectedIndexCollection die jij gemaakt hebt, wijst gewoon naar diezelfde collectie, die nu dus leeg is.

In het 2de geval, maak je een nieuwe arraylist, en voeg je daar zelf alle integers (value types) aan toe. Die arraylist wijst dus niet naar de SelectedIndices property van de listview, maar naar een ander stuk geheugen.

Jouw voorbeeld met een integer werkt idd anders, aangezien een integer een value type is. (Leestip: reference types en values types op MSDN)

Maak bv eens een class:
code:
1
2
3
4
class Bliep
{
     public int a = 5;
}


Gebruik die class dan in een app:
code:
1
2
3
4
5
Bliep melp = new Bliep();
Console.WriteLine (melp.a);
Bliep vtt = melp;
melp.a = 6;
Console.WriteLine (vtt.a);

en kijk eens wat de output is. :)

[ Voor 24% gewijzigd door whoami op 31-01-2006 16:27 ]

https://fgheysels.github.io/


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 17:49
Waarschijnlijk zet
ListView.SelectedIndexCollection sic = this.listView.SelectedIndices;
alleen een reference naar de SelectedIndices collection van je ListView. Op het moment dat jij je ListView opnieuw vult, is er niks geselecteerd en is
this.listView.SelectedIndices dus leeg, net als sic, aangezien ze beide gewoon een reference zijn naar hetzelfde object.

Edit: spuit 11

[ Voor 4% gewijzigd door sig69 op 31-01-2006 16:28 ]

Roomba E5 te koop


  • mahi
  • Registratie: Juni 2001
  • Laatst online: 03-10-2025

mahi

God bless GoT

Topicstarter
Ja, het is me nu duidelijk waar het probleem zit. Het was verkeerd om zomaar aan te nemen dat er een echte kopie van het object gemaakt zou worden.

Bedankt! :)

A bus station is where a bus stops. A train station is where a train stops... On my desk I have a workstation.