|
Hi,
I am creating the Columns dynamically, depending on the return of a database query. And there seems to be a problem, when the Columns are re-created multiple times with the same query there is no problem; but if the new query has a column of different DataType (usually DateTime) then it throws an exception (is using in reallity the previous SortManager although it was re-created with the new Columns). It seems that something has to be cleaned...
Roberto
|
|
|
|
|
You have to reassign the comparers for each column with a call to SetComparerTypes.
If this doesn't help, send me a minimal code sample and I'll see what I can do.
A complex system that does not work is invariably found to have evolved from a simpler system that worked just fine. - Murphy's Law of Computing
|
|
|
|
|
Hi Eddie,
I have an Oracle sql worksheet application where the user enters sql queries and the results are displayed in a listview. Say the user entered:
select username from dba_users
Then I know that one column is returned and after working out the datatype of the column I create the sort manager as follows:
m_sortMgr = new ListViewSortManager(listViewDisplay,
column_sort_type);
where column_sort_type[0] = EV.Windows.Forms.ListViewTextCaseInsensitiveSort
The user then changes the query:
select username,default_tablespace from dba_users
Prior to displaying the data I clear the listViewDisplay and create the sort manager as before:
m_sortMgr = new ListViewSortManager(listViewDisplay,
column_sort_type);
where column_sort_type[0] = EV.Windows.Forms.ListViewTextCaseInsensitiveSort
and column_sort_type[1] = EV.Windows.Forms.ListViewTextCaseInsensitiveSort
When I try and sort on the second column I get a range exception error
in ListViewSortManager
if(column < 0 || column >= m_comparers.Length)
throw new IndexOutOfRangeException();
I tried calling m_sortMgr.SetComparerTypes(column_sort_type);
after creating the sort manager but without success.
Is it possible to initialse or clear the sort manager before the second or subsequent queries?
Otherwise it works really well!
Thanks,
Jim
|
|
|
|
|
Hi guys,
I encountered this EXACT issue and was about to create a new thread. I am doing the same thing - dynamically creating columns based on database queries. I even go as far as destroying the sort manager (objSortMgr = Nothing) but somehow the listview still clings to the previous sort order it was set to.
Was a solution ever found for this problem?
As jwatemail said before: "Otherwise it works really well!"
Thanks in advance...
Rommel the iCeMAn,
Computer Programmer,
Barbados, West Indies.
|
|
|
|
|
Hi Rommel,
I never did get any feedback so I decided to clear the parent tab control and recreate the listview for each query. This may seem rather heavy handed but in practice it works fine. I have about a dozen users working away on a daily basis without problem (well in this bit at least!).
Cheers,
Jim
|
|
|
|
|
Hey,
I've got some good news - I hope!!! . I did some more experimenting and eventually arrived at the following:
<br />
'remove old sort<br />
ListView1.ListViewItemSorter = Nothing<br />
<br />
'implement new sorter - based on your query results<br />
objSortManager.SetComparerTypes(objNewComparer)<br />
<br />
'sort by first column<br />
'<br />
'(when this line is omitted the listview isn't sorted until the user actually clicks a column header)<br />
objSortManager.Sort(0, SortOrder.Ascending)<br />
This worked well for me. I didn't notice any side effects, I was scared at first of "ListView1.ListViewItemSorter = Nothing" as I've never tinkered with that property directly, but I decided to try it anyways.
Hope this works for you as well.
Rommel the iCeMAn,
Computer Programmer,
Barbados, West Indies.
|
|
|
|
|
Hi,
I've successfully compiled your class into a library (EV.Windows.Forms.dll). If added the reference to my VB.NET project but I'm stuck on how to convert the C# declaration.
Here's the C# code (as provided by author):
public MainForm()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
m_sortMgr = new ListViewSortManager(m_list,
new Type[] {
typeof(ListViewTextSort),
typeof(ListViewTextCaseInsensitiveSort),
typeof(ListViewIntegerSort),
typeof(ListViewFloatSort),
typeof(ListViewDateSort)
}
);
}
Here's my VB code:
Public Sub New()
MyBase.New()
'This call is required by the Windows Form Designer.
InitializeComponent()
'Add any initialization after the InitializeComponent() call
'
'initialize sorter - this is the line that's giving me stress
oListviewSort = New ListViewSortManager(Listview1, ?????)
Does anyone here know the equivalent VB code?
Thanks in advance
Rommel the iCeMAn,
Computer Programmer,
Barbados, West Indies.
|
|
|
|
|
People, I've found a solution. It's a bit awkward, but it works It appears that C#'s typeof is different to VB.NET's TypeOf. Anyways, here's my code:
'variable declarations
'
'listview sorter
Private oListviewSort As ListViewSortManager
'
'array of comparers (only 2 comparers here because my listview only has 2 columns)
Private oComparers() As System.Type = {New ListViewDateSort(0, True).GetType, New ListViewTextSort(0, True).GetType}
#Region " Windows Form Designer generated code "
Public Sub New()
MyBase.New()
'This call is required by the Windows Form Designer.
InitializeComponent()
'Add any initialization after the InitializeComponent() call
'
'add sorter to listview
oListviewSort = New ListViewSortManager(lvwLogs, oComparers)
End Sub
<rest of="" code="">
#End Region
After this stunt the listview sorts as expected
iCeMAn out...
Rommel the iCeMAn,
Computer Programmer,
Barbados, West Indies.
|
|
|
|
|
Hi Eddie,
everytime if I fill the listview after sorting it takes long time for filling the listview (many hundred items). After every item the sortmanager sorts the listview new. How can I turn it off? I can start sorting after finnishing the new filling manually, it works much more faster.
Although I set before refilling the sortmanager to null, nevertheless the comparefunction will be executed.
How does it work correctly?
By the way, I changed the typearray for sortingtypes to a arraylist, so I can change my listview dynamically and add or remove sortcolumns. Maybe it's a good feature for your next version?
Ciao, Jimmy
|
|
|
|
|
I found the solution!
Only set listview1.ListViewItemSorter = null!
Thanx!
Ciao, Jimmy
|
|
|
|
|
Could you please explain it more? I also have the same problem.
|
|
|
|
|
Hi Epon
because ListViewSortManager is a external control I thought I have to switch off the ListViewSortManager control for non sorting. But you have to delete the ListViewItemSorter in the ListView control (listView.ListViewItemSorter = null).
Excample:
SortOrder ordertemp = m_sortMgr.SortOrder;<br />
int sortColumn = m_sortMgr.Column;<br />
listView1.ListViewItemSorter = null;<br />
listView1.BeginUpdate();<br />
listView1.Items.Clear();<br />
<br />
... fill listview ... <br />
<br />
if((sortColumn > -1) && (sortColumn < listView1.Columns.Count))<br />
m_sortMgr.Sort(sortColumn,ordertemp); <br />
listView1.EndUpdate();
Ciao, Jimmy S.
|
|
|
|
|
Try using the SortEnabled property of the ListViewSortManager object:
sortManager.SortEnabled = false; Yes, I know, a few days too late!
[EDIT: I just read that property is new as of realease 1.4]
-- LuisR
Luis Alonso Ramos
Intelectix - Chihuahua, Mexico
Not much here: My CP Blog!
|
|
|
|
|
I don't know if it's too late for this, but I didn't see where anyone had posted an actual VB.NET version, except for that one that doesn't include the arrow, and seeing as how I'm trying to keep the software on my pc at work 'legal', meaning I do not have C Sharp installed, I decided to convert it. It is a straight conversion, I didn't change anything or add anything.
Here is the url: http://bellsouthpwp.net/j/a/jasonage/ListViewSortManager.zip
|
|
|
|
|
Have you considered using the HDF_SORTUP and HDF_SORTDOWN flags for the arrow on your header? This gives you Explorer-style up/down arrows without having to worry about image-lists, etc.
It is available with ComCtl 6 or later - which is pretty much everyone (although I admit that in my implementation I check the version and regress to images if prior to 6 - using your approach for drawing the bitmaps).
Arlen (www.cowthulu.com)
|
|
|
|
|
Thanks a bunch! This is exactly what I've been looking for -- even implements the sort state icons!
Also, wrote myself a custom sort type -- ListViewIPSort. Great code, thanks!
Skydive -- Testing gravity, one jump at a time.
|
|
|
|
|
Can this have a VB version especially the graphics part (drawing the header order icon)?
I have converted that part to VB but Im having problems: the icon is not showing up.
|
|
|
|
|
Well, I'm not a VB developer, so I can't really help you there. But, that said, you CAN use this component in VB.NET projects, just create an C# class library and reference it from you project.
If Java had true garbage collection, most programs would delete themselves upon execution - Robert Sewell
|
|
|
|
|
You have?
Could/would you provide a link or something?
I'm having trouble with the types-array.
Thank's in advance!
Stevie
Greetings,
Stephan Eberle
hawke@deltacity.org
|
|
|
|
|
I have created my own listview sorter.
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=2435&lngWId=10
|
|
|
|
|
I'm new to C#. I have a program that populates a listview in the Load method. How to I simulate a mouse click on a column header to get the view sorted (so the sort order image is displayed in the column header).
Thanks in advance,
Hal
|
|
|
|
|
You don't have to "simulate" a mouse click on the column header, you just have to call Sort() with the column number and the sort order.
If Java had true garbage collection, most programs would delete themselves upon execution - Robert Sewell
|
|
|
|
|
Thank you for the reply. When I try Sort(0, SortOrder.Ascending); the compiler tells me that the name Sort does not exist in the class or namespace. Trying ListViewSortManager.Sort(0, SortOrder.Ascending); results in the following error:
An object reference is required for the nonstatic field, method, or property 'EV.Windows.Forms.ListViewSortManager.Sort(int, System.Windows.Forms.SortOrder)'
Regards,
Hal
|
|
|
|
|
Are you calling Sort() on an instance of ListViewSortManager()?
i.e.
<code>
m_sortMgr = new ListViewSortManager(m_list, new Type[] {
typeof(ListViewTextSort),
typeof(ListViewTextCaseInsensitiveSort),
typeof(ListViewInt32Sort),
typeof(ListViewDoubleSort),
typeof(ListViewDateSort)
});
m_sortMgr.Sort(0, SortOrder.Ascending);
</code>
<hr><small><i>If Java had true garbage collection, most programs would delete themselves upon execution - Robert Sewell</i></small>
|
|
|
|
|
Thank you. I did not have m_sortMgr. on the Sort statement. It is working fine now.
Regards,
Hal
|
|
|
|