List1.AddItem (Patient.Recordset("Cpr")) & Chr(9) & _
(Patient.Recordset("Fornavn")) & Chr(9) & _
(Patient.Recordset("Mellemnavn")) & Chr(9) & _
(Patient.Recordset("Efternavn")) & Chr(9) & _
(Patient.Recordset("Adresse")) & Chr(9) & _
(Patient.Recordset("Postnr_")) & Chr(9) & _
når så Længden på de forskellige data-stringe variere, ja så ligner
Listbox'en lyn-hurtigt en rodet affære.
derfor ville jeg så bruge Windows Common Controls 6.0, og jeg tror måske
også godt den kan løse opgaven, men fejlen ligger 40cm fra tasteturet.
Jeg gik ind og oprettede de forskellige kolonner, men har ikke kunne få lagt
nogle data i førnævnte, er der nogen der kan give lidt hjælp!!!!
I den oprindelig Listbox udnytter jeg at man kan trykke på en række og bruge
listindex til at finde yderlige data i en database, kan min nye listbox også
det????
Joachim Boll
Hej Joachim.
Er det listview du mener?
I så fald skal du starte med at oprette de kolonner du skal bruge, og husk
at sætte View til 3-lvwReport, -så får du dine data præsenteret i kolonner.
Tilføj dine elementer til den første kolonne med:
ListView.ListItems.Add([index], [key], [text], [icon], [smallicon]).
For at tilføje elementer til de andre kolonner bruger du:
ListView.ListItems(index).SubItems(1) = "Tekst"
ListView.ListItems(index).SubItems(2) = "Mere tekst"
...osv
Du kan også bruge listindex i listview'en, eller du kan tilføje dine egen
værdi til Key.
Håber du kan bruge det til noget, ellers er du velkommen til at skrive igen!
--
Lasse
Og her kommer lige et par nemme funktioner:
Først kører du en DefineListview, hvor du sender en streng over bestående af
"header1" & VBTab & kolonnebredde osv - det gør du for de kolonner, du skal
anvende:
Sub DefineListView(Data As String, ByRef lstwObject As Object)
Dim D
Dim Count As Integer
D = Split(Data, Chr(9))
For Count = 1 To (UBound(D) + 1) / 2
lstwObject.ColumnHeaders.Add , , D((Count - 1) * 2), D(((Count - 1) * 2)
+ 1)
Next Count
End Sub
Og når du så skal tilføje data, bruger du AddToListView "Data1" & VBTab &
"Data2" osv.:
Sub AddToListView(Data As String, ByRef lstwObject As ListView)
Dim D
Dim Count As Integer
Dim Height As Integer
Dim LRow As Integer
D = Split(Data, Chr(9))
LRow = lstwObject.ListItems.Count + 1
lstwObject.ListItems.Add Val(LRow), , D(0)
If UBound(D) > 0 Then
For Count = 1 To UBound(D)
lstwObject.ListItems(LRow).ListSubItems.Add = D(Count)
Next Count
End If
End Sub
Pas bare lidt på med listview'en. Med alternativet til listview'en,
flexgrid, kan du lave sortering på de enkelte kolonner udfra såvel tekst som
talværdi. Dvs som tal kommer 1 før 02, mens som tekst kommer 02 før 1.
I et listview kan du kun sortere efter tekst :-(
Til gengæld er listview'en mere dynamisk - så det må være efter behov
hvilken kontrol man vælger.
Jan
La meg så glede dere alle med en utrolig nyttig modul som sorterer en Lvw
også på tall eller dato-tid. Jeg kan dessverre ikke finne hvem som i sin tid
skrev den -den er fra den fantastiske http://www.planet-source-code.com/ -
men den er erfaringsmessig meget pålitelig, jeg anvender den i nærmest alle
mine prosjekter for mange hundre brukere og den svikter aldri.
Option Explicit
Private Declare Function LockWindowUpdate Lib "user32" (ByVal hwndLock As
Long) As Long
Public Enum ListDataType
ldtString = 0
ldtNumber = 1
ldtDateTime = 2
End Enum
'***************************************************************************
****
' Sort a ListView by String, Number, or DateTime
'
' Parameters:
'
' ListView Reference to the ListView control to be sorted.
' Index Index of the column in the ListView to be sorted. The first
' column in a ListView has an index value of 1.
' DataType Sets whether the data in the column is to be sorted
' alphabetically, numerically, or by date.
' Ascending Sets the direction of the sort. True sorts A-Z (Ascending),
' and False sorts Z-A (descending)
'---------------------------------------------------------------------------
----
Public Sub SortListView(ListView As ListView, ByVal Index As Integer, _
ByVal datatype As ListDataType, ByVal Ascending As Boolean)
On Error Resume Next
Dim i As Integer
Dim l As Long
Dim strFormat As String
' Display the hourglass cursor whilst sorting
Dim lngCursor As Long
lngCursor = ListView.MousePointer
ListView.MousePointer = vbHourglass
' Prevent the ListView control from updating on screen - this is to hide
' the changes being made to the listitems, and also to speed up the sort
LockWindowUpdate ListView.hWnd
Dim blnRestoreFromTag As Boolean
Select Case datatype
Case ldtString
' Sort alphabetically. This is the only sort provided by the
' MS ListView control (at this time), and as such we don't really
' need to do much here
blnRestoreFromTag = False
Case ldtNumber
' Sort Numerically
strFormat = String$(20, "0") & "." & String$(10, "0")
' Loop through the values in this column. Re-format the values so
' as they can be sorted alphabetically, having already stored their
' text values in the tag, along with the tag's original value
With ListView.ListItems
If (Index = 1) Then
For l = 1 To .Count
With .Item(l)
.Tag = .Text & Chr$(0) & .Tag
If IsNumeric(.Text) Then
If CDbl(.Text) >= 0 Then
.Text = Format(CDbl(.Text), strFormat)
Else
.Text = "&" & InvNumber(Format(0 -
CDbl(.Text), strFormat))
End If
Else
.Text = ""
End If
End With
Next l
Else
For l = 1 To .Count
With .Item(l).ListSubItems(Index - 1)
.Tag = .Text & Chr$(0) & .Tag
If IsNumeric(.Text) Then
If CDbl(.Text) >= 0 Then
.Text = Format(CDbl(.Text), strFormat)
Else
.Text = "&" & InvNumber(Format(0 -
CDbl(.Text), strFormat))
End If
Else
.Text = ""
End If
End With
Next l
End If
End With
blnRestoreFromTag = True
Case ldtDateTime
' Sort by date.
strFormat = "YYYYMMDDHhNnSs"
Dim dte As Date
' Loop through the values in this column. Re-format the dates so as
they
' can be sorted alphabetically, having already stored their visible
' values in the tag, along with the tag's original value
With ListView.ListItems
If (Index = 1) Then
For l = 1 To .Count
With .Item(l)
.Tag = .Text & Chr$(0) & .Tag
dte = CDate(.Text)
.Text = Format$(dte, strFormat)
End With
Next l
Else
For l = 1 To .Count
With .Item(l).ListSubItems(Index - 1)
.Tag = .Text & Chr$(0) & .Tag
dte = CDate(.Text)
.Text = Format$(dte, strFormat)
End With
Next l
End If
End With
blnRestoreFromTag = True
End Select
' Sort the ListView Alphabetically
ListView.SortOrder = IIf(Ascending, lvwAscending, lvwDescending)
ListView.SortKey = Index - 1
ListView.Sorted = True
' Restore the Text Values if required
If blnRestoreFromTag Then
' Restore the previous values to the 'cells' in this column of the
list
' from the tags, and also restore the tags to their original values
With ListView.ListItems
If (Index = 1) Then
For l = 1 To .Count
With .Item(l)
i = InStr(.Tag, Chr$(0))
.Text = Left$(.Tag, i - 1)
.Tag = Mid$(.Tag, i + 1)
End With
Next l
Else
For l = 1 To .Count
With .Item(l).ListSubItems(Index - 1)
i = InStr(.Tag, Chr$(0))
.Text = Left$(.Tag, i - 1)
.Tag = Mid$(.Tag, i + 1)
End With
Next l
End If
End With
End If
' Unlock the list window so that the OCX can update it
LockWindowUpdate 0&
' Restore the previous cursor
ListView.MousePointer = lngCursor
End Sub
'***************************************************************************
****
' Modifies a numeric string to allow it to be sorted alphabetically
'---------------------------------------------------------------------------
----
Private Function InvNumber(ByVal Number As String) As String
Static i As Integer
For i = 1 To Len(Number)
Select Case Mid$(Number, i, 1)
Case "-": Mid$(Number, i, 1) = " "
Case "0": Mid$(Number, i, 1) = "9"
Case "1": Mid$(Number, i, 1) = "8"
Case "2": Mid$(Number, i, 1) = "7"
Case "3": Mid$(Number, i, 1) = "6"
Case "4": Mid$(Number, i, 1) = "5"
Case "5": Mid$(Number, i, 1) = "4"
Case "6": Mid$(Number, i, 1) = "3"
Case "7": Mid$(Number, i, 1) = "2"
Case "8": Mid$(Number, i, 1) = "1"
Case "9": Mid$(Number, i, 1) = "0"
End Select
Next
InvNumber = Number
End Function
'***************************************************************************
****
'
'---------------------------------------------------------------------------
----
Hej Lasse
Mangfe tak for hjælpen, det var lige hvad jeg manglede, men jeg har lige et
sidste spørgsmål:
Her ser du hvordan jeg kaster Data ind i listen
With ListView1.ListItems.Add
. ?????? = Data1.Recordset("Fornavn")
'???????????????????????
.SubItems(1) = Data1.Recordset("Fornavn")
.SubItems(2) = Data1.Recordset("Mellemnavn")
.SubItems(3) = Data1.Recordset("Efternavn")
.SubItems(4) = Data1.Recordset("Adresse")
.SubItems(5) = Data1.Recordset("postnr")
End With
Men jeg har lidt problemer med at ligge data ind i den første kolonne, jeg
burde bare kunne skrive SubItems(0), men nej er der nogen som har gode
ide'er
Joachim
"Joachim Boll" <joachi...@DETTEinmedico.dk> skrev i en meddelelse
news:403dcfaf$0$1621$edfa...@dread14.news.tele.dk...
Prøv at kigge på de 2 funktioner jeg (fra arbejdet) lagde til dig - de gør
det meget lettere.
--
Jan
Remove the cat in the email to reach me
Taaak
Den skal afprøves med det samme, jeg sidder i forvejen og roder med et
projekt, hvor jeg skal bruge Listview'en, så jeg vil lige smide det her ind
og se hvordan det kører.
Jan
Hej Joachim
Den første kolonne er ikke en subitem, så den tilføjer du bare med
ListView1.ListItems.Add()
Din kode kunne f.eks. se således ud:
dim i as integer 'Bruges til index, i de forskellige listitems.
for i = 0 to Data1.Recordset.count
With ListView1
.Listitems.Add(i, Data1.Recordset("Fornavn")
.Listitems(i).SubItems(1) = Data1.Recordset("Fornavn")
.Listitems(i).SubItems(2) = Data1.Recordset("Mellemnavn")
.Listitems(i).SubItems(3) = Data1.Recordset("Efternavn")
.Listitems(i).SubItems(4) = Data1.Recordset("Adresse")
.Listitems(i).SubItems(5) = Data1.Recordset("postnr")
'Indsæt kode til at gå til næste post, eller får du en uendelig
løkke...
Next
Koden er ikke testet, og skal måske lige tilpasses lidt :o)
Men prøv evt. at kigge på Jans eksempel.
Med venlig hilsen
--
Lasse
Jeg har et modul, hvor de to ligger i og jeg har nu også tilføjet den fra
Harald (som jeg dog mangler at teste endnu).
Jan