Home All Groups Group Topic Archive Search About

Need to sort ListView columns that contain dates

Author
26 Jun 2005 11:56 PM
**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

Author
27 Jun 2005 8:40 AM
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

Show quoteHide quote
" **Developer**" <REMOVEdevelo***@a-znet.com> escribió en el mensaje
news:emKtsqqeFHA.228@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(mColumnToSort).Text,
> lListviewY.SubItems(mColumnToSort).Text) 'Or can do this
>
> End Try
>
>
>
Author
27 Jun 2005 12:28 PM
**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

Show quoteHide quote
"Carlos J. Quintero [.NET MVP]" <carlosq@NOSPAMsogecable.com> wrote in
message news:O$yJbPveFHA.2180@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**" <REMOVEdevelo***@a-znet.com> escribió en el mensaje
> news:emKtsqqeFHA.228@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(mColumnToSort).Text,
>> lListviewY.SubItems(mColumnToSort).Text) 'Or can do this
>>
>> End Try
>>
>>
>>
>
>
Author
27 Jun 2005 12:35 PM
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

Show quoteHide quote
" **Developer**" <REMOVEdevelo***@a-znet.com> escribió en el mensaje
news:e4Ga%23OxeFHA.228@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
>
Author
27 Jun 2005 1:57 PM
**Developer**
Now that I think of it that makes sense

Thanks


Show quoteHide quote
"Carlos J. Quintero [.NET MVP]" <carlosq@NOSPAMsogecable.com> wrote in
message news:eb8%23xSxeFHA.3280@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**" <REMOVEdevelo***@a-znet.com> escribió en el mensaje
> news:e4Ga%23OxeFHA.228@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
>>
>
Author
27 Jun 2005 2:14 PM
Doug Taylor
On Mon, 27 Jun 2005 14:35:07 +0200, "Carlos J. Quintero [.NET MVP]"
<carlosq@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
Author
27 Jun 2005 2:39 PM
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

Show quoteHide quote
"Doug Taylor" <Doug.TaylorNTP@tayNOSPAMmade.demon.co.uk> escribió en el
mensaje news:0620c1lbh32pjq6b7nn5o0gg4b7omatun6@4ax.com...
> On Mon, 27 Jun 2005 14:35:07 +0200, "Carlos J. Quintero [.NET MVP]"
> <carlosq@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
>
Author
27 Jun 2005 3:19 PM
**Developer**
"Carlos J. Quintero [.NET MVP]" <carlosq@NOSPAMsogecable.com> wrote in
message news:OOYrJYyeFHA.3808@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.
Author
27 Jun 2005 4:10 PM
Carlos J. Quintero [.NET MVP]
" **Developer**" <REMOVEdevelo***@a-znet.com> escribió en el mensaje
news:%23Ph%23TuyeFHA.3712@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
Author
27 Jun 2005 4:40 PM
**Developer**
Show quote Hide quote
"Carlos J. Quintero [.NET MVP]" <carlosq@NOSPAMsogecable.com> wrote in
message news:OWxpGLzeFHA.1448@TK2MSFTNGP14.phx.gbl...
>
> " **Developer**" <REMOVEdevelo***@a-znet.com> escribió en el mensaje
> news:%23Ph%23TuyeFHA.3712@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
Author
27 Jun 2005 2:47 PM
**Developer**
"Doug Taylor" <Doug.TaylorNTP@tayNOSPAMmade.demon.co.uk> wrote in message
news:0620c1lbh32pjq6b7nn5o0gg4b7omatun6@4ax.com...
> On Mon, 27 Jun 2005 14:35:07 +0200, "Carlos J. Quintero [.NET MVP]"
> <carlosq@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




Show quoteHide quote
> 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
>
Author
27 Jun 2005 2:59 PM
**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)


Show quoteHide quote
" **Developer**" <REMOVEdevelo***@a-znet.com> wrote in message
news:OBac1cyeFHA.3280@TK2MSFTNGP09.phx.gbl...
>
> "Doug Taylor" <Doug.TaylorNTP@tayNOSPAMmade.demon.co.uk> wrote in message
> news:0620c1lbh32pjq6b7nn5o0gg4b7omatun6@4ax.com...
>> On Mon, 27 Jun 2005 14:35:07 +0200, "Carlos J. Quintero [.NET MVP]"
>> <carlosq@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
>>
>
>
Author
27 Jun 2005 4:13 PM
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

Show quoteHide quote
" **Developer**" <REMOVEdevelo***@a-znet.com> escribió en el mensaje
news:%231MyejyeFHA.3280@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)
>
Author
27 Jun 2005 4:38 PM
**Developer**
"Carlos J. Quintero [.NET MVP]" <carlosq@NOSPAMsogecable.com> wrote in
message news:ePA13MzeFHA.688@TK2MSFTNGP14.phx.gbl...
> You can use System.TypeCode

Thanks