Toon posts:

MFC Listview

Pagina: 1
Acties:

Verwijderd

Topicstarter
ik heb in c++ een listbox gemaakt met een aantal kolommen.
Ik kan waardes toevoegen aan die kolommen, maar als ik een waarde verwijder, kan ik alleen keihard ingeven welk regelnummer weg moet..
ik wil echter met de muis kunnen aanklikken welke regel weg moet...
dus hoe zorg ik dat de geselecteerde regelnummer(s) worden gereturned naar bv een integer?

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 22-08 01:56
Ik begrijp je probleem niet helemaal. Je kunt toch gewoon de huidige selectie van de listview opvragen en die elementen weggooien? Of is dat juist het probleem?

Verwijderd

Topicstarter
Soultaker schreef op 03 May 2003 @ 21:47:
Ik begrijp je probleem niet helemaal. Je kunt toch gewoon de huidige selectie van de listview opvragen en die elementen weggooien? Of is dat juist het probleem?
Hoe doe je dat precies?
Lijkt me wel interessant om te weten.. Maar dat is eigenlijk niet wat ik bedoelde..


Ik heb zeg maar het volgende bij een listbox:

CListCtrl& lCtrl = GetListCtrl();
lCtrl.InsertColumn(0, "Naam", LVCFMT_LEFT, 120);
lCtrl.InsertColumn(1, "Adres", LVCFMT_CENTER, 80);
lCtrl.InsertColumn(2, "Woonplaats", LVCFMT_LEFT, 120);
int nItem;
nItem = lCtrl.InsertItem(0, "Pietje");
lCtrl.SetItemText(nItem, 1, "teststraat");
lCtrl.SetItemText(nItem, 2, "Test");

Nu wil ik dus dmv het indrukken van een knop, dat de geselecteerde regel verwijderd word in die lijst.

Dus als ik bv 4 kolommen heb, met 5 rijen ofzo, dat ik dan op rij 3 kan klikken, en daarna op de knop: "verwijderen".

Met lCtrl.DeleteItem(1) kan ik regel 2 dus verwijdernen..
Maar nu wil dus dat er ipv dat er keihard een 1 staat, daar een variabele komt, die de waarde "nummer van de aangeklikte regel" krijgt.

Dat lijkt me toch wel mogelijk?

[ Voor 5% gewijzigd door Verwijderd op 03-05-2003 22:01 ]


Verwijderd

// Zo delete je alle geselecteerde rijen..

POSITION pos = lCtrl.GetFirstSelectedItemPosition();
while ( pos )
{
int nItem = lCtrl.GetNextSelectedItem(pos);
lCtrl.DeleteItem(nItem);
}

Success ermee.

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:17
Heb je het nu over een ListView of een ListBox?

Als je een ListView hebt, kan je toch direct het geselecteerde item aanspreken, en een ListItem object heeft een Delete() method oid dacht ik.

Als je niet direct het geselecteerde item kunt aanspreken, dan kan je wel het nummer van het geselecteerde item aanspreken. Adhv dat nummer kan je ook wel het item verwijderen.

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op 04 mei 2003 @ 09:59:
Heb je het nu over een ListView of een ListBox?

Als je een ListView hebt, kan je toch direct het geselecteerde item aanspreken, en een ListItem object heeft een Delete() method oid dacht ik.

Als je niet direct het geselecteerde item kunt aanspreken, dan kan je wel het nummer van het geselecteerde item aanspreken. Adhv dat nummer kan je ook wel het item verwijderen.
Ik heb het over een listview, het stond er een beetje onduidelijk, dat klopt..

Ja, je kan het geselecteerde item nummer aanspreken, wat Densetsu2 schreef klopt precies :)

Verwijderd

Topicstarter
Verwijderd schreef op 04 May 2003 @ 08:15:
// Zo delete je alle geselecteerde rijen..

POSITION pos = lCtrl.GetFirstSelectedItemPosition();
while ( pos )
{
int nItem = lCtrl.GetNextSelectedItem(pos);
lCtrl.DeleteItem(nItem);
}

Success ermee.
Ja, je hebt gelijk _/-\o_

Zo heb ik het nu, en het werkt precies zoals ik het wilde :)
Bedankt!


void CListView::OnKnop1()
{
int nItem;
CListCtrl& lCtrl = GetListCtrl();
POSITION pos = lCtrl.GetFirstSelectedItemPosition();

nItem = lCtrl.GetNextSelectedItem(pos);
lCtrl.DeleteItem(nItem);
}

Verwijderd

Vergeet wel niet te kijken of pos niet 0 is nadat je GetFirstSelectedItemPosition() hebt aangeroepen. Als je dat niet doet gaat er waarschijnlijk iets fout als geen item geselecteerd is.

if ( pos )
{
nItem = lCtrl.GetNextSelectedItem(pos);
lCtrl.DeleteItem(nItem);
}

Verwijderd

Topicstarter
Verwijderd schreef op 04 May 2003 @ 11:49:
Vergeet wel niet te kijken of pos niet 0 is nadat je GetFirstSelectedItemPosition() hebt aangeroepen. Als je dat niet doet gaat er waarschijnlijk iets fout als geen item geselecteerd is.

if ( pos )
{
nItem = lCtrl.GetNextSelectedItem(pos);
lCtrl.DeleteItem(nItem);
}
Als ik niets selecteer gebeurt er ook niets.. Maar misschien is dat toeval?
Ik zal bovenstaande er ook in zetten, veiligheid voor alles.. :)

  • The End
  • Registratie: Maart 2000
  • Laatst online: 13:32

The End

!Beginning

Verwijderd schreef op 04 mei 2003 @ 08:15:
// Zo delete je alle geselecteerde rijen..

POSITION pos = lCtrl.GetFirstSelectedItemPosition();
while ( pos )
{
int nItem = lCtrl.GetNextSelectedItem(pos);
lCtrl.DeleteItem(nItem);
}

Success ermee.
Even voor de duidelijkheid, dit is ook fout. (Zou goed moeten zijn, maar het werkt niet)
Omdat je een item weggooid, veranderd de index (nItem) van alle items daaronder; echter GetNextSelectedItem geeft nog steeds de oude index terug. Uiteindelijk gooi je dan de verkeerde items weg.
Wat je moet doen is zoiets als dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void Ondelete()
{
   POSITION    Pos = NULL;
   CUIntArray  IndexArray;
   if((Pos = MyList.GetFirstSelectedItemPosition()) == NULL)
       return;
   while(Pos)
   {
          // haal alle indexen op
          int Index = MyList.GetNextSelectedItem(Pos); 
          IndexArray.Add(Index);
   }
   // delete de items achterstevoren
   for(int i = IndexArray.GetSize() - 1;i >= 0;i--)
       MyList.DeleteItem(IndexArray.GetAt(i));
}
Pagina: 1