Rishav Posted September 9, 2009 Share Posted September 9, 2009 Hi folksI have written a simple UI to show the contents of a csv file in a listview. However, i wanted the columns to be sortable by clicking on the column headers. I tried to use _GUICtrlListView_SimpleSort function but have absolutely no idea how to proceed. the helpfile gives no description of the $iCol parameter and the example provided is too tough for me to understand. expandcollapse popup$csv_file = FileOpenDialog("Select CSV file", "C:\Documents and Settings\rishavs\My Documents\My Dropbox\Workspace\Automata\Automata Scripts\Output Log\System Log.csv","csv files (*.csv)",1) ;~ $csv_file = "C:\Documents and Settings\rishavs\My Documents\My Dropbox\Workspace\Automata\Automata Scripts\Output Log\System Log.csv" #include <GUIConstants.au3> #include <File.au3> #include <GuiListView.au3> Dim $csvArray ;Read CSV to array _FileReadToArray($csv_file, $csvArray) ;Replace all commas with pipe symbols For $i = 1 To $csvArray[0] $csvArray[$i] = StringReplace($csvArray[$i], ",", "|") Next $LogViewer_gui = GUICreate("System Log Viewer", 1200, 900, -1, -1) ;Use first row as header $listview = GUICtrlCreateListView($csvArray[1], 10, 10, 1180, 880, $LVS_REPORT, $LVS_EX_GRIDLINES ) GUICtrlSetBkColor($listview, $GUI_BKCOLOR_LV_ALTERNATE) _GUICtrlListView_SimpleSort($listview, True, 1) _GUICtrlListView_BeginUpdate($listview) ;Create all listview items For $i = 2 To $csvArray[0] GUICtrlCreateListViewItem($csvArray[$i], $listview) GUICtrlSetBkColor(-1, 0xEcEcEc) Next For $a = 0 To _GUICtrlListView_GetColumnCount($listview) _GUICtrlListView_SetColumnWidth($listview, $a, $LVSCW_AUTOSIZE_USEHEADER) Next _GUICtrlListView_EndUpdate($listview) GUISetState() Do $msg = GUIGetMsg() Until $msg = $GUI_EVENT_CLOSEI have also added a csv file incase you want one.thanks and regardsRishavSystem Log.zip Link to comment Share on other sites More sharing options...
water Posted September 9, 2009 Share Posted September 9, 2009 (edited) Based on the example found in the help file for _GUICtrlListView_Create I catch $LVN_COLUMNCLICK and use the following code to sort: $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam) _GUICtrlListView_SimpleSort($hWndListView, $bSort, DllStructGetData($tInfo, "SubItem")) You have to set $bSort in advance to "False". This variable keeps the sort direction. Your example script should now look like: expandcollapse popup$csv_file = FileOpenDialog("Select CSV file", "C:\Documents and Settings\rishavs\My Documents\My Dropbox\Workspace\Automata\Automata Scripts\Output Log\System Log.csv","csv files (*.csv)",1) ;~ $csv_file = "C:\Documents and Settings\rishavs\My Documents\My Dropbox\Workspace\Automata\Automata Scripts\Output Log\System Log.csv" #include <GUIConstants.au3> #include <File.au3> #include <GuiListView.au3> #include <WindowsConstants.au3> Dim $csvArray Global $bSort = False ; Sort direction ;Read CSV to array _FileReadToArray($csv_file, $csvArray) ;Replace all commas with pipe symbols For $i = 1 To $csvArray[0] $csvArray[$i] = StringReplace($csvArray[$i], ",", "|") Next GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") $LogViewer_gui = GUICreate("System Log Viewer", 1200, 900, -1, -1) ;Use first row as header $hlistview = GUICtrlCreateListView($csvArray[1], 10, 10, 1180, 880, $LVS_REPORT, $LVS_EX_GRIDLINES ) GUICtrlSetBkColor($hlistview, $GUI_BKCOLOR_LV_ALTERNATE) _GUICtrlListView_BeginUpdate($hlistview) ;Create all listview items For $i = 2 To $csvArray[0] GUICtrlCreateListViewItem($csvArray[$i], $hlistview) GUICtrlSetBkColor(-1, 0xEcEcEc) Next For $a = 0 To _GUICtrlListView_GetColumnCount($hlistview) _GUICtrlListView_SetColumnWidth($hlistview, $a, $LVSCW_AUTOSIZE_USEHEADER) Next _GUICtrlListView_EndUpdate($hlistview) GUISetState() Do $msg = GUIGetMsg() Until $msg = $GUI_EVENT_CLOSE Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam) #forceref $hWnd, $iMsg, $iwParam Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo ;~ Local $tBuffer $hWndListView = $hListView If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView) $tNMHDR = DllStructCreate($tagNMHDR, $ilParam) $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom")) $iIDFrom = DllStructGetData($tNMHDR, "IDFrom") $iCode = DllStructGetData($tNMHDR, "Code") Switch $hWndFrom Case $hWndListView Switch $iCode Case $LVN_COLUMNCLICK ; A column was clicked $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam) _GUICtrlListView_SimpleSort($hWndListView, $bSort, DllStructGetData($tInfo, "SubItem")) ; No return value EndSwitch EndSwitch Return $GUI_RUNDEFMSG EndFunc ;==>WM_NOTIFY Edited September 9, 2009 by water My UDFs and Tutorials: Spoiler UDFs:Active Directory (NEW 2022-02-19 - Version 1.6.1.0) - Download - General Help & Support - Example Scripts - WikiExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example ScriptsOutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - WikiOutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - DownloadOutlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - WikiPowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - WikiTask Scheduler (NEW 2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs:Excel - Example Scripts - WikiWord - Wiki Tutorials:ADO - WikiWebDriver - Wiki Link to comment Share on other sites More sharing options...
Rishav Posted September 9, 2009 Author Share Posted September 9, 2009 Thanks for the reply Water. I also got it to work by trial and error. realized that i was missing the _GUICtrlListView_RegisterSortCallBack function. expandcollapse popup$csv_file = FileOpenDialog("Select CSV file", "C:\Documents and Settings\rishavs\My Documents\My Dropbox\Workspace\Automata\Automata Scripts\Output Log\System Log.csv", "csv files (*.csv)", 1) ;~ $csv_file = "C:\Documents and Settings\rishavs\My Documents\My Dropbox\Workspace\Automata\Automata Scripts\Output Log\System Log.csv" #include <GUIConstants.au3> #include <File.au3> #include <GuiListView.au3> Dim $csvArray ;Read CSV to array _FileReadToArray($csv_file, $csvArray) ;Replace all commas with pipe symbols For $i = 1 To $csvArray[0] $csvArray[$i] = StringReplace($csvArray[$i], ",", "|") Next $LogViewer_gui = GUICreate("System Log Viewer", 1200, 950, -1, -1) $LogViewer_button = GUICtrlCreateButton("Refresh", 550, 910, 100) ;Use first row as header $listview = GUICtrlCreateListView($csvArray[1], 10, 10, 1180, 880) _GUICtrlListView_SetExtendedListViewStyle($listview, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES, $LVS_EX_DOUBLEBUFFER)) _GUICtrlListView_RegisterSortCallBack($listview) GUICtrlSetBkColor($listview, $GUI_BKCOLOR_LV_ALTERNATE) _GUICtrlListView_BeginUpdate($listview) ;Create all listview items For $i = 2 To $csvArray[0] GUICtrlCreateListViewItem($csvArray[$i], $listview) GUICtrlSetBkColor(-1, 0xEcEcEc) Next For $a = 0 To _GUICtrlListView_GetColumnCount($listview) _GUICtrlListView_SetColumnWidth($listview, $a, $LVSCW_AUTOSIZE_USEHEADER) Next _GUICtrlListView_EndUpdate($listview) GUISetState() While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE _GUICtrlListView_UnRegisterSortCallBack($listview) ExitLoop Case $listview _GUICtrlListView_SortItems($listview, GUICtrlGetState($listview)) Case $LogViewer_button _GUICtrlListView_DeleteAllItems($listview) _GUICtrlListView_BeginUpdate($listview) ;Create all listview items For $i = 2 To $csvArray[0] GUICtrlCreateListViewItem($csvArray[$i], $listview) GUICtrlSetBkColor(-1, 0xEcEcEc) Next For $a = 0 To _GUICtrlListView_GetColumnCount($listview) _GUICtrlListView_SetColumnWidth($listview, $a, $LVSCW_AUTOSIZE_USEHEADER) Next _GUICtrlListView_EndUpdate($listview) EndSwitch WEnd The only problem now is that sorting takes 1-2 seconds while i was hoping for it to be instanteneous. Link to comment Share on other sites More sharing options...
PartyPooper Posted September 9, 2009 Share Posted September 9, 2009 The only problem now is that sorting takes 1-2 seconds while i was hoping for it to be instanteneous.You and me both. Wait until you get a listview of 65,000 items - it takes over an hour to sort. If you find the answer to quicker sorting, post it up please. I'm sure there are more than a few of us waiting for that one. Link to comment Share on other sites More sharing options...
martin Posted September 9, 2009 Share Posted September 9, 2009 You and me both. Wait until you get a listview of 65,000 items - it takes over an hour to sort. If you find the answer to quicker sorting, post it up please. I'm sure there are more than a few of us waiting for that one.I expect you will get a big improvement simply by using _GUICtrlListView_BeginUpdate before you start sorting and _GUICtrlListView_EndUpdate after sorting. You could also try copying to an array, sorting the array and copying back which I would expect to be faster. Serial port communications UDF Includes functions for binary transmission and reception.printing UDF Useful for graphs, forms, labels, reports etc.Add User Call Tips to SciTE for functions in UDFs not included with AutoIt and for your own scripts.Functions with parameters in OnEvent mode and for Hot Keys One function replaces GuiSetOnEvent, GuiCtrlSetOnEvent and HotKeySet.UDF IsConnected2 for notification of status of connected state of many urls or IPs, without slowing the script. Link to comment Share on other sites More sharing options...
PartyPooper Posted September 9, 2009 Share Posted September 9, 2009 I expect you will get a big improvement simply by using _GUICtrlListView_BeginUpdate before you start sorting and _GUICtrlListView_EndUpdate after sorting. You could also try copying to an array, sorting the array and copying back which I would expect to be faster.I'll look into those functions thanks Martin. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now