By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
428,997 Members | 1,470 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 428,997 IT Pros & Developers. It's quick & easy.

Need to sort ListView columns that contain dates

P: n/a
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(mC olumnToSort).Text,
lListviewY.SubItems(mColumnToSort).Text) 'Or can do this

End Try

Nov 21 '05 #1
Share this Question
Share on Google+
13 Replies


P: n/a
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

" **Developer**" <RE*************@a-znet.com> escribió en el mensaje
news:em*************@TK2MSFTNGP12.phx.gbl...
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(mC olumnToSort).Text,
lListviewY.SubItems(mColumnToSort).Text) 'Or can do this

End Try

Nov 21 '05 #2

P: n/a
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

"Carlos J. Quintero [.NET MVP]" <ca*****@NOSPAMsogecable.com> wrote in
message news:O$**************@TK2MSFTNGP12.phx.gbl...
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

" **Developer**" <RE*************@a-znet.com> escribió en el mensaje
news:em*************@TK2MSFTNGP12.phx.gbl...
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(mC olumnToSort).Text,
lListviewY.SubItems(mColumnToSort).Text) 'Or can do this

End Try


Nov 21 '05 #3

P: n/a
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

" **Developer**" <RE*************@a-znet.com> escribió en el mensaje
news:e4***************@TK2MSFTNGP12.phx.gbl...
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


Nov 21 '05 #4

P: n/a
Now that I think of it that makes sense

Thanks
"Carlos J. Quintero [.NET MVP]" <ca*****@NOSPAMsogecable.com> wrote in
message news:eb****************@TK2MSFTNGP09.phx.gbl...
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

" **Developer**" <RE*************@a-znet.com> escribió en el mensaje
news:e4***************@TK2MSFTNGP12.phx.gbl...
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

Nov 21 '05 #5

P: n/a
On Mon, 27 Jun 2005 14:35:07 +0200, "Carlos J. Quintero [.NET MVP]"
<ca*****@NOSPAMsogecable.com> wrote:
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

Nov 21 '05 #6

P: n/a
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

"Doug Taylor" <Do************@tayNOSPAMmade.demon.co.uk> escribió en el
mensaje news:06********************************@4ax.com...
On Mon, 27 Jun 2005 14:35:07 +0200, "Carlos J. Quintero [.NET MVP]"
<ca*****@NOSPAMsogecable.com> wrote:

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

Nov 21 '05 #7

P: n/a

"Doug Taylor" <Do************@tayNOSPAMmade.demon.co.uk> wrote in message
news:06********************************@4ax.com...
On Mon, 27 Jun 2005 14:35:07 +0200, "Carlos J. Quintero [.NET MVP]"
<ca*****@NOSPAMsogecable.com> wrote:
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 think that will work niceky. I already have a ColumnAdd method and will
simply insert an optional type parameter.

Thanks alot

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

Nov 21 '05 #8

P: n/a
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)
" **Developer**" <RE*************@a-znet.com> wrote in message
news:OB**************@TK2MSFTNGP09.phx.gbl...

"Doug Taylor" <Do************@tayNOSPAMmade.demon.co.uk> wrote in message
news:06********************************@4ax.com...
On Mon, 27 Jun 2005 14:35:07 +0200, "Carlos J. Quintero [.NET MVP]"
<ca*****@NOSPAMsogecable.com> wrote:
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 think that will work niceky. I already have a ColumnAdd method and will
simply insert an optional type parameter.

Thanks alot

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


Nov 21 '05 #9

P: n/a

"Carlos J. Quintero [.NET MVP]" <ca*****@NOSPAMsogecable.com> wrote in
message news:OO**************@TK2MSFTNGP14.phx.gbl...
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.

Nov 21 '05 #10

P: n/a

" **Developer**" <RE*************@a-znet.com> escribió en el mensaje
news:%2******************@TK2MSFTNGP09.phx.gbl...
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

Nov 21 '05 #11

P: n/a
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

" **Developer**" <RE*************@a-znet.com> escribió en el mensaje
news:%2****************@TK2MSFTNGP09.phx.gbl...
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)


Nov 21 '05 #12

P: n/a

"Carlos J. Quintero [.NET MVP]" <ca*****@NOSPAMsogecable.com> wrote in
message news:eP*************@TK2MSFTNGP14.phx.gbl...
You can use System.TypeCode


Thanks

Nov 21 '05 #13

P: n/a

"Carlos J. Quintero [.NET MVP]" <ca*****@NOSPAMsogecable.com> wrote in
message news:OW**************@TK2MSFTNGP14.phx.gbl...

" **Developer**" <RE*************@a-znet.com> escribió en el mensaje
news:%2******************@TK2MSFTNGP09.phx.gbl...
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...
--

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
Nov 21 '05 #14

This discussion thread is closed

Replies have been disabled for this discussion.