Need to sort ListView columns that contain dates

D

**Developer**

I need to sort the columns of a ListView.

Some columns contain dates and others contain integers.

What I did once before is in the Compare method I tried date and if that
failed I did Integer.

Seems kinda not nice - is there a better way?

Thanks
Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer
Implements IComparer.Compare

-snip

''Cast the objects to be compared to ListViewItem objects.

lListviewX = CType(x, ListViewItem)

lListviewY = CType(y, ListViewItem)

Try

'Parse the two objects passed as a parameter as a DateTime.

Dim lFirstDate As System.DateTime =
DateTime.Parse(lListviewX.SubItems(mColumnToSort).Text)

Dim lSecondDate As System.DateTime =
DateTime.Parse(lListviewY.SubItems(mColumnToSort).Text)

'Compare the two dates.

lCompareResult = DateTime.Compare(lFirstDate, lSecondDate)

' Catch

'If neither compared object has a valid date format compare the two items
as a string

lCompareResult =
mInsensitiveCompare.Compare(lListviewX.SubItems(mColumnToSort).Text,
lListviewY.SubItems(mColumnToSort).Text) 'Or can do this

End Try
 
C

Carlos J. Quintero [.NET MVP]

Can´t you know in advance which is the data type of each column? If not then
you have to guess it, but I would do that before comparing, that is, take
the first listitem, guess if the column contains date or integer and then
call a different comparer for each case.

--
Best regards,

Carlos J. Quintero

MZ-Tools: Productivity add-ins for Visual Studio .NET, VB6, VB5 and VBA
You can code, design and document much faster.
Free resources for add-in developers:
http://www.mztools.com
 
D

**Developer**

This is a generally used usercontrol so that would be difficult unless I
required the form containing the control to do something to help.

Can't I get the type in the method somehow?

Thanks
 
C

Carlos J. Quintero [.NET MVP]

No, the type is text always, so you must guess its format.

--
Best regards,

Carlos J. Quintero

MZ-Tools: Productivity add-ins for Visual Studio .NET, VB6, VB5 and VBA
You can code, design and document much faster.
Free resources for add-in developers:
http://www.mztools.com
 
D

**Developer**

Now that I think of it that makes sense

Thanks


Carlos J. Quintero said:
No, the type is text always, so you must guess its format.

--
Best regards,

Carlos J. Quintero

MZ-Tools: Productivity add-ins for Visual Studio .NET, VB6, VB5 and VBA
You can code, design and document much faster.
Free resources for add-in developers:
http://www.mztools.com
 
D

Doug Taylor

No, the type is text always, so you must guess its format.

You could always inherit from the list view and extend the columns
property by having the column type as an attribute and then call the
appropriate comparator.

I had a similar issue with a list view that shows information from a
database table, here I used the column index returned on the column
header click event and used that to refer into the datatable and find
out what the database definition of that column's type was.

Doug Taylor
 
C

Carlos J. Quintero [.NET MVP]

Hi Doug,

I know what you mean, but that would require some collaboration from the
user of the usercontrol, wouldn´t it? I mean, if the user passes or uses the
classes of the listview instead of the extended ones from the inherited
listview...


--
Best regards,

Carlos J. Quintero

MZ-Tools: Productivity add-ins for Visual Studio .NET, VB6, VB5 and VBA
You can code, design and document much faster.
Free resources for add-in developers:
http://www.mztools.com
 
D

**Developer**

Doug Taylor said:
You could always inherit from the list view and extend the columns
property by having the column type as an attribute and then call the
appropriate comparator.

I think that will work niceky. I already have a ColumnAdd method and will
simply insert an optional type parameter.

Thanks alot
 
D

**Developer**

I could develop a enum for the different types but I wonder if there is
already something I could use?

That is:

Public Sub ColumnAdd(ByVal header As String......,optional byval columnType
as ???=string)
 
D

**Developer**

Carlos J. Quintero said:
Hi Doug,

I know what you mean, but that would require some collaboration from the
user of the usercontrol, wouldn´t it? I mean, if the user passes or uses
the classes of the listview instead of the extended ones from the
inherited listview...


Good point, I'd have to check to be sure I have a type stored for the column
and if not do what I'm doing now.

I'm assuming one of the problems whith using Try-Catch is that it is slow.
Is that right??


With or without Doug's suggestion,
Would it be better if when the routine is entered it checks to see if a type
is stored for that column and if not figure it out and store it.

Then

Select case storedTypeForColumn(..)
case int

case string
..
..
..

That way it would only check once per column.
 
C

Carlos J. Quintero [.NET MVP]

**Developer** said:
I'm assuming one of the problems whith using Try-Catch is that it is
slow. Is that right??

Yes, exceptions should be avoided, but if you do it only once it is fine.

With or without Doug's suggestion,
Would it be better if when the routine is entered it checks to see if a
type is stored for that column and if not figure it out and store it.

That's error prone. For example, you get "1": is it a string or an integer
number? You may guess that it is a number. Later you get "1.1" for that same
column -> the type is likely to be float number...or you get "A" -> the type
was not an integer number, it was a string after all...


--
Best regards,

Carlos J. Quintero

MZ-Tools: Productivity add-ins for Visual Studio .NET, VB6, VB5 and VBA
You can code, design and document much faster.
Free resources for add-in developers:
http://www.mztools.com
 
C

Carlos J. Quintero [.NET MVP]

You can use System.TypeCode

--
Best regards,

Carlos J. Quintero

MZ-Tools: Productivity add-ins for Visual Studio .NET, VB6, VB5 and VBA
You can code, design and document much faster.
Free resources for add-in developers:
http://www.mztools.com
 
D

**Developer**

Carlos J. Quintero said:
Yes, exceptions should be avoided, but if you do it only once it is fine.



That's error prone. For example, you get "1": is it a string or an integer
number? You may guess that it is a number. Later you get "1.1" for that
same column -> the type is likely to be float number...or you get "A" ->
the type was not an integer number, it was a string after all...


--
Actually I did think about that.

As long as I'm giving the user a way of telling, I'll probably just assume
string if not told.

Thanks again
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top