Toon posts:

[vb] listview column item

Pagina: 1
Acties:
  • 243 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Is het mogelijk om met een listview die gevuld is met waardes uit een database de waarde op te vragen waar je muis op het moment op staat ? Dus niet de hele regel maar alleen de kolom ?

Stel ik heb een listview met naw gegevens en wil in een msgbox het telefoonnummer van het geselecteerde item hebben. Hoe vertel ik vb dat hij op de kolom telefoonnummer staat ?

  • whoami
  • Registratie: December 2000
  • Laatst online: 09:01
Je kan het selected item uitlezen.
Je kan de columns (subitems) uitlezen.
......

https://fgheysels.github.io/


Verwijderd

Topicstarter
Het gaat inderdaad om een subitem ja daar was ik al uit maar hoe weet de listview dan in welke kolom ik sta ?

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 22-05 22:34

Gerco

Professional Newbie

gebruik de method HitTest(x, y), dan kun je de item op een bepaalde plaats uitlezen.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Verwijderd

Topicstarter
Het klinkt mischien heel dom maar ik voer nu onderstaand stukje code uit en ik krijg de selecteditem.text terug. Heb je mischien een heel klein voorbeeldje hoe ik het geselecteerde kolommetje terugkrijg?
code:
1
2
3
4
5
6
7
8
9
Dim MouseX As Single
Dim MouseY As Single
Dim oitem As ListItem
MouseX = x
MouseY = y
Set oitem = ListView1.HitTest(MouseX, MouseY)
If Not oitem Is Nothing Then
MsgBox "Klick auf " & oitem.Text
End If

Verwijderd

Vooropgesteld dat je index in kolom 1 staat is dit de oplossing:

code:
1
2
3
Private Sub ListView1_Click()
    MsgBox ListView1.SelectedItem.SubItems(1)
End Sub


staat de index in een andere kolom, dan vul je die uiteraard in ;)

BTW het gaat niet om de kolom, het gaat om de rij waarop je klikt. Die bepaald welke kolom je wilt uitlezen.

[ Voor 22% gewijzigd door Verwijderd op 28-01-2004 11:28 ]


  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 22-05 22:34

Gerco

Professional Newbie

Ik denk dat de TS zijn data in een grid wil zien en dan van een bepaalde geklikte cel de tekst wil zien. Een listview is geen grid en dus heeft die geen CellClicked achtige voorziening. Wat de TS wel kan doen is zelf een LVM_HITTEST message naar ListView1.hWnd sturen en dan de structure die daarbij hoort uitlezen. Daar staat wel een iSubItem member in.

[ Voor 3% gewijzigd door Gerco op 28-01-2004 13:06 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • flexje
  • Registratie: September 2001
  • Laatst online: 12:40

flexje

got-father

Gerco schreef op 28 januari 2004 @ 13:05:
Ik denk dat de TS zijn data in een grid wil zien en dan van een bepaalde geklikte cel de tekst wil zien. Een listview is geen grid en dus heeft die geen CellClicked achtige voorziening. Wat de TS wel kan doen is zelf een LVM_HITTEST message naar ListView1.hWnd sturen en dan de structure die daarbij hoort uitlezen. Daar staat wel een iSubItem member in.
Als je meerdere kolommen hebt en je gebruikt de index van de subitem en als je daarna klikt op een row dan krijg je toch echt wel de waarde van de cel van de kolom dat je gekozen hebt...
code:
1
ListView1.SelectedItem.SubItems(kolomindex)

"Try not to become a man of success but rather to become a man of value..."


Verwijderd

Topicstarter
flexje schreef op 28 januari 2004 @ 15:40:
[...]


Als je meerdere kolommen hebt en je gebruikt de index van de subitem en als je daarna klikt op een row dan krijg je toch echt wel de waarde van de cel van de kolom dat je gekozen hebt...
code:
1
ListView1.SelectedItem.SubItems(kolomindex)
Dat klopt ja maar ik wil dat het programma ziet op welke kolom de pijl van mn muis staat. Die manier van jouw wist ik al maar daar schiet ik absoluut niks mee op

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 22-05 22:34

Gerco

Professional Newbie

Verwijderd schreef op 28 januari 2004 @ 16:00:
Dat klopt ja maar ik wil dat het programma ziet op welke kolom de pijl van mn muis staat. Die manier van jouw wist ik al maar daar schiet ik absoluut niks mee op
Probeer dan die message eens te sturen, zoals ik ook gemaild heb.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Verwijderd

Topicstarter
Ik ben nog niet thuis geweest Gerco. Ik ga vanavond weer proberen. Dan stuur ik wel even wat resultaten op. Dit berichtje was voor flexje bedoeld

Verwijderd

Topicstarter
Ik heb van alles geprobeerd maar ik snap er echt totaal niks van. Ik heb nog nooit met api calls gewerkt. Mischien dat je een klein voorbeeldje wilt geven ?

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 22-05 22:34

Gerco

Professional Newbie

ok, klein voorbeeldje:

Maak een nieuw form, plaats er een listview op en schrijf wat code om daar wat items in te zetten.

Declareer de functie SendMessage, die declaratie kun vinden in de API viewer die bij VB zit.
Visual Basic .NET:
1
Private Declare Function SendMessage Lib "USER32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long


Dan declareer je de Types en Constants die deze functie nodig heeft, ook te vinden in de API viewer en MSDN.
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Type POINTAPI
    x As Long
    y As Long
End Type

Private Type LVHITTESTINFO
    pt       As POINTAPI
    flags    As Long
    iItem    As Long
    iSubItem As Long
End Type

Private Const LVM_FIRST = &H1000&
Private Const LVM_SUBITEMHITTEST As Long = (LVM_FIRST + 57)


In de ListView1_MouseDown event van de listview krijg je x en y coordinaten mee, deze zijn in twips, dus moet je omrekenen naar pixels.
Visual Basic .NET:
1
2
3
Dim lvhi As LVHITTESTINFO
lvhi.pt.x = x / Screen.TwipsPerPixelX
lvhi.pt.y = y / Screen.TwipsPerPixelY


Dan roep je SendMessage aan op deze manier:
Visual Basic .NET:
1
SendMessage ListView1.hWnd, LVM_SUBITEMHITTEST, 0, lvhi


En als laatste lees je de waardes uit de LVHITTESTINFO struct
Visual Basic .NET:
1
2
3
4
5
6
7
If lvhi.iItem >= 0 And lvhi.iItem < ListView1.ListItems.Count Then
    If lvhi.iSubItem = 0 Then
        Text1.Text = ListView1.ListItems(lvhi.iItem + 1).Text
    Else
        Text1.Text = ListView1.ListItems(lvhi.iItem + 1).SubItems(lvhi.iSubItem)
    End If
End If

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Verwijderd

Topicstarter
Hier heb ik zeker wat aan. Bedankt

Verwijderd

Topicstarter
Sorry voor de kick in 1ste instantie. Ik vond het zonde om er een nieuw topic voor te openen omdat ik een aanvullende vraag heb. Wat Gerco als voorbeeld had gepost werkt uitstekend maar nu vraag ik me af of het ook mogelijk is op deze manier om de kolomnaam tevoorschijn te toveren. Dus de kolomnaam EN de waarde die op de regel in de kolom staat waar je met de muis klikt.

  • DukeMan
  • Registratie: Mei 2000
  • Niet online
Je weet de kolom index.. dan kan je met ListViews.Columnheaders(x).Text de naam omvragen
Pagina: 1