|
-
Nov 24th, 2000, 06:05 AM
#1
Thread Starter
Fanatic Member
Does anybody know how to get this to work?
The listview seems only capable of accepting strings as it's items so dates have to be converted to text and therefore are sorted as text.
How can I get around this?
-
Nov 24th, 2000, 06:37 AM
#2
PowerPoster
ColumnClick Events
hope this can help you...
Code:
Private Sub listview_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
listview.SortKey = ColumnHeader.Index - 1
If listview.SortOrder = lvwAscending Then
listview.SortOrder = lvwDescending
Else
listview.SortOrder = lvwAscending
End If
listview.Sorted = True
End Sub
-
Nov 24th, 2000, 08:58 AM
#3
Thread Starter
Fanatic Member
Well,
Not really. If the column contains a date, it is sorted as a string (and therefore not in date order).
I know how to sort columns generally but dates (and number columns for that matter) are a problem.
Thanks anyway,
Simon.
-
Nov 24th, 2000, 09:01 AM
#4
_______
<?>
Code:
'CREATE SORTING OF LISTVIEW BY ALPHA, NUMBER, DATE
'
'PUT THIS IN GEN DECLARATIONS OF FORM
'*****************************************************************
'
Private Declare Function LockWindowUpdate Lib "user32" _
(ByVal hWndLock As Long) As Long
'
Private Function InvNumber(ByVal Number As String) As String
'This function is to deal with the negative numbers, so then they can be sorted alphabetically
'
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
'
'LOAD THE LISTVIEW WITH RANDOM INFORMATION
'PUT THIS IN LOAD OR CLICK
'*********************************************************
'
Dim l As Long
Dim dblRnd As Double
Dim dteRnd As Date
With ListView1
' Add three columns to the list - one for each data type.
' Note that the data type is set in the column header's
' tag in each case
'
.ColumnHeaders.Add(, , "String").Tag = "STRING"
.ColumnHeaders.Add(, , "Number").Tag = "NUMBER"
.ColumnHeaders.Add(, , "Date").Tag = "DATE"
'
' Set the column alignment - has no bearing on the sorts.
'
.ColumnHeaders(1).Alignment = lvwColumnLeft
.ColumnHeaders(2).Alignment = lvwColumnRight
.ColumnHeaders(3).Alignment = lvwColumnCenter
'
' Set BorderStyle property.
ListView1.BorderStyle = ccFixedSingle
'
' Set View property to Report.
ListView1.View = lvwReport
'
' Populate the list with data
With .ListItems
For l = 1 To 100
With .Add(, , "ListItem " & Format(l, "0000"))
dblRnd = (Rnd() * 10000) - 5000
dteRnd = (Rnd() * 1000) + Date
.ListSubItems.Add , , Format(dblRnd, "0.00")
.ListSubItems.Add , , Format(dteRnd, _
"dd/mm/yyyy")
End With
Next l
End With
End With
'
'PUT THIS IN THE COLUMNCLICK EVENT OF LISTVIEW
'***********************************************
Dim lngStart As Long
Dim lngCursor As Long
Dim l As Long
Dim strFormat As String
Dim strData() As String
Dim lngIndex As Long
On Error Resume Next
With ListView1
' Display the hourglass cursor while list is sorting
lngCursor = .MousePointer
.MousePointer = vbHourglass
' Prevent the ListView control from updating on screen
' and also to speed up the sort
LockWindowUpdate .hWnd
' Check the data type of the column being sorted,
lngIndex = ColumnHeader.Index - 1
Select Case UCase$(ColumnHeader.Tag)
Case "DATE"
' Sort by date.
strFormat = "YYYYMMDDHhNnSs"
' Loop through the values in this column. Re-format
' the dates so as they can be sorted alphabetically,
With .ListItems
If (lngIndex > 0) Then
For l = 1 To .Count
With .Item(l).ListSubItems(lngIndex)
.Tag = .Text & Chr$(0) & .Tag
If IsDate(.Text) Then
.Text = Format(CDate(.Text), _
strFormat)
Else
.Text = ""
End If
End With
Next l
Else
For l = 1 To .Count
With .Item(l)
.Tag = .Text & Chr$(0) & .Tag
If IsDate(.Text) Then
.Text = Format(CDate(.Text), _
strFormat)
Else
.Text = ""
End If
End With
Next l
End If
End With
' Sort the list alphabetically by this column
.SortOrder = (.SortOrder + 1) Mod 2
.SortKey = ColumnHeader.Index - 1
.Sorted = True
' 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 .ListItems
If (lngIndex > 0) Then
For l = 1 To .Count
With .Item(l).ListSubItems(lngIndex)
strData = Split(.Tag, Chr$(0))
.Text = strData(0)
.Tag = strData(1)
End With
Next l
Else
For l = 1 To .Count
With .Item(l)
strData = Split(.Tag, Chr$(0))
.Text = strData(0)
.Tag = strData(1)
End With
Next l
End If
End With
Case "NUMBER"
' Sort Numerically
strFormat = String(30, "0") & "." & String(30, "0")
'Re-format the values so as they
' can be sorted alphabetically.
With .ListItems
If (lngIndex > 0) Then
For l = 1 To .Count
With .Item(l).ListSubItems(lngIndex)
.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)
.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
' Sort the list alphabetically by this column
.SortOrder = (.SortOrder + 1) Mod 2
.SortKey = ColumnHeader.Index - 1
.Sorted = True
' 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 .ListItems
If (lngIndex > 0) Then
For l = 1 To .Count
With .Item(l).ListSubItems(lngIndex)
strData = Split(.Tag, Chr$(0))
.Text = strData(0)
.Tag = strData(1)
End With
Next l
Else
For l = 1 To .Count
With .Item(l)
strData = Split(.Tag, Chr$(0))
.Text = strData(0)
.Tag = strData(1)
End With
Next l
End If
End With
Case Else
'Just sort it alphabetically
.SortOrder = (.SortOrder + 1) Mod 2
.SortKey = ColumnHeader.Index - 1
.Sorted = True
End Select
' Unlock the list window so that the OCX can update it
LockWindowUpdate 0&
' Restore the previous cursor
.MousePointer = lngCursor
End With
"A myth is not the succession of individual images,
but an integerated meaningful entity,
reflecting a distinct aspect of the real world."
___ Adolf Jensen
-
Nov 24th, 2000, 09:17 AM
#5
An easier way to sort is to add the date in yyyymmdd format into the tag property of the listitem, and use that to sort on.
- gaffa
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|