Rishav Posted September 9, 2009 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
water Posted September 9, 2009 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 2024-07-28 - Version 1.6.3.0) - Download - General Help & Support - Example Scripts - Wiki ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki Task Scheduler (2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs: Excel - Example Scripts - Wiki Word - Wiki Tutorials: ADO - Wiki WebDriver - Wiki
Rishav Posted September 9, 2009 Author 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.
PartyPooper Posted September 9, 2009 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.
martin Posted September 9, 2009 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.
PartyPooper Posted September 9, 2009 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.
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