[.NET] Raar gedrag met een ListView.

Pagina: 1
Acties:

  • whoami
  • Registratie: December 2000
  • Laatst online: 06:06
Ik heb een Windows applicatie met een listview.

Ik heb code die een bepaald item selecteert:
code:
1
2
3
4
if( lvResults.Items.Count > 0 )
{
   lvResults.Items[0].Selected = true;
}

Allemaal goed.
Echter, als ik de SelectedItems.Count property uitlees, krijg ik 0 terug. Zelfs als ik dat er direct na doe:
code:
1
2
3
4
5
if( lvResults.Items.Count > 0 )
{
   lvResults.Items[0].Selected = true;
   System.Diagnostics.Debug.WriteLine (lvResults.SelectedItems.Count.ToString());
}


Zeer vreemd...
Ik heb ook al eens geprobeerd om na de regel waarin ik het listviewitem selecteer, een DoEvents te doen, maar ook dat haalt niets uit...

Iemand enig idee wat het probleem hier kan zijn ?

https://fgheysels.github.io/


  • Serpie
  • Registratie: Maart 2005
  • Laatst online: 05-02 21:24
Is de listview Visible? dat is de enige situatie waarvan ik weet dat de selecteditems collectie leeg blijft.

Ook in 2005 :(
http://lab.msdn.microsoft...08-4b0d-91df-4ed0c06ca1ab

  • Not Pingu
  • Registratie: November 2001
  • Laatst online: 01-04 20:36

Not Pingu

Dumbass ex machina

@whoami:
Hier heb ik ook al eens last van gehad, in de volgende situaties:

- onselectedindexchanged event afvangen, gaat bij de eerste klik op een listviewitem goed, bij de tweede klik is de selecteditems collectie ineens leeg.
- Listviewitems toevoegen en eentje selected = true zetten

Ik weet niet precies wat je met het listview wilt doen, maar ipv. de selectedindexchanged event af te vangen, kun je ook de onitemactivated event afvangen. die reageert op dubbelkik op een item en dan is de selecteditem wel gevuld.

Certified smart block developer op de agile darkchain stack. PM voor info.


  • whoami
  • Registratie: December 2000
  • Laatst online: 06:06
De ListView is visible.

https://fgheysels.github.io/


  • Serpie
  • Registratie: Maart 2005
  • Laatst online: 05-02 21:24
Gunp01nt schreef op woensdag 04 januari 2006 @ 20:05:
- onselectedindexchanged event afvangen, gaat bij de eerste klik op een listviewitem goed, bij de tweede klik is de selecteditems collectie ineens leeg.
Hmm, hij komt 2 keer, een keer omdat het vorige item gedeselecteerd wordt (hier staat hij dus op 0)en eenmaal als het nieuwe item geselecteerd wordt (hij staat weer op 1).

Wat ook heel geinig verzonnen is (NOT) is dat het event ook komt als je hetzelfde item nogmaals selecteerd, ben toch wel erg blij dat wij aangekochte controls hebben op het werk, want de standaard controls zitten soms toch wel rare dingen in.

[ Voor 4% gewijzigd door Serpie op 04-01-2006 20:22 ]


  • Not Pingu
  • Registratie: November 2001
  • Laatst online: 01-04 20:36

Not Pingu

Dumbass ex machina

whoami: je moet niet alleen de selected property instellen, maar ook de focuseditem property van de listview. bron.

Certified smart block developer op de agile darkchain stack. PM voor info.


  • whoami
  • Registratie: December 2000
  • Laatst online: 06:06
Hmm, dat zou inderdaad wel eens het probleem kunnen zijn.
Morgen of overmorgen maar eens nakijken. thx.

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 06:06
Het zal zeker met de FocusedItem te maken hebben, aangezien deze in het geval waarbij het niet werkt, NULL Is.
Echter, FocusedItem is read-only.

Als ik dan expliciet de focus ga zetten op de listview, dan werkt het echter nog niet.

https://fgheysels.github.io/


  • Not Pingu
  • Registratie: November 2001
  • Laatst online: 01-04 20:36

Not Pingu

Dumbass ex machina

Heb het even gauw getest, en in zowel 2.0 als in 1.1 werkt het volgende:

code:
1
2
3
4
5
6
7
8
9
10
11
ListViewItem bla = new ListViewItem("testen");
bla.Selected = true;
bla.Focused = true;

lstTest.Items.Add(bla);

try
{
        txtOutput.Text = lstTest.SelectedItems[0].Text;
}
catch {}


txtOutput heeft dan de waarde 'testen'.

[ Voor 10% gewijzigd door Not Pingu op 06-01-2006 10:28 ]

Certified smart block developer op de agile darkchain stack. PM voor info.


  • whoami
  • Registratie: December 2000
  • Laatst online: 06:06
Mja, ik heb dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
if( lvResults.Items.Count > 0 )
{
    lvResults.Select();
    lvResults.Focus();

    if( lvResults.SelectedItems.Count == 0 )
    {
         lvResults.Items[0].Selected = true;
         lvResults.Items[0].Focused = true;
    }
    System.Diagostics.Debug.WriteLine (lvResults.Items.Count);
    System.Diagostics.Debug.WriteLine (lvResults.FocusedItem == null);
}

en ik krijg als output 0 en true.

Bovenstaande code staat in een usercontrol (die dus een listview bevat), en die usercontrol staat op een form die vanop een andere form uitgevoerd wordt.
Bovenstaande code staat in een public method van die usercontrol, die dus aangeroepen wordt vanaf de form die de usercontrol bevat.

https://fgheysels.github.io/


  • Not Pingu
  • Registratie: November 2001
  • Laatst online: 01-04 20:36

Not Pingu

Dumbass ex machina

Kennelijk herevalueert ie de items niet die al in zijn items collectie zitten. Probeer het eens door de desbetreffende index in de items collectie op te halen als ListViewItem, dan de Selected en Focused properties setten en dan dat object weer in de ListView.Items collectie te stoppen?

Certified smart block developer op de agile darkchain stack. PM voor info.


Verwijderd

Je moet lvResults.Select() aanroepen nadat je de selected property van de desbetreffende items op true hebt gezet.

[ Voor 6% gewijzigd door Verwijderd op 06-01-2006 11:16 ]


  • EfBe
  • Registratie: Januari 2000
  • Niet online
whoami schreef op woensdag 04 januari 2006 @ 17:59:
Ik heb een Windows applicatie met een listview.

Ik heb code die een bepaald item selecteert:
code:
1
2
3
4
if( lvResults.Items.Count > 0 )
{
   lvResults.Items[0].Selected = true;
}

Allemaal goed.
Echter, als ik de SelectedItems.Count property uitlees, krijg ik 0 terug. Zelfs als ik dat er direct na doe:
code:
1
2
3
4
5
if( lvResults.Items.Count > 0 )
{
   lvResults.Items[0].Selected = true;
   System.Diagnostics.Debug.WriteLine (lvResults.SelectedItems.Count.ToString());
}


Zeer vreemd...
nee is niet vreemd. :) Winforms is asynchroon, want je werkt met win32 onder water en jouw Selected=true roept onder water een SendMessage aan van win32.

Het kan dus zijn dat wanneer jij selecteditems aanroept het geheel nog niet in sync is. Die listview is overigens zo gaar als wat: de events lopen nl. niet zoals je zou verwachten. Als je bv wanneer de selected row in de listview wijzigt een textbox activeert en daar een validation event op definieert, dan krijg je dat validation event NADAT je alweer naar een andere row gemoved bent. En dus alles in het honderd loopt.

Dus wees voorbereid op veel tijdverlies. Ook het resizen van columns is broken, dat moet je handmatig doen na iedere edit, en met gare -1 en -2 values anders werkt het niet. Ik zou echt gaan voor een 3rd party grid, scheelt je veel tijd.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com

Pagina: 1