Reinhardt1julian Posted December 2, 2013 Share Posted December 2, 2013 I have a list view (first two colums are Name and Surname). Now I want to sort the items by alphabet. It should sort the names from A to Z and if the Name is teh shame it should sort it by the surname, too. I know about the _GUICtrlListView_SimpleSort() Function, but that only sorts one column. My problem is, that I want to save a value with the number in the list view (first is number one, second is number two...) in a file so when I need to retreive that value I search for the number of the item in the file. Thank you! Link to comment Share on other sites More sharing options...
Moderators Melba23 Posted December 2, 2013 Moderators Share Posted December 2, 2013 Reinhardt1julian,I posted this UDF a while ago which sorts exactly as you require. You would need to extract the contents of the ListView into an array, sort the array with the UDF and then reload the array into the ListView - which is a lot easier than it sounds, believe me! Let me know if I can help you get it all working. M23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area Link to comment Share on other sites More sharing options...
Reinhardt1julian Posted December 2, 2013 Author Share Posted December 2, 2013 (edited) @Melba23 Since I have not worked with Arraylists before I am not quite understanding your code. And I don't know what $aSortData needs to be. And for me it has a Syntax error (in the AMCS_Ex.au3) at line 20 ("Global $aSortData[][] = [ _") Character 19 Edited December 2, 2013 by Reinhardt1julian Link to comment Share on other sites More sharing options...
Moderators Melba23 Posted December 2, 2013 Moderators Share Posted December 2, 2013 Reinhardt1julian,I will work up an example for you so that you can see it in action. And you get the error because you need the Beta to run that syntax. M23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area Link to comment Share on other sites More sharing options...
Moderators Melba23 Posted December 2, 2013 Moderators Share Posted December 2, 2013 Reinhardt1julian,Here you go: expandcollapse popup#include <GUIConstantsEx.au3> #include <GUIListView.au3> #include "ArrayMultiColSort.au3" #include <Array.au3> Global $aList[8][2] = [[7, 0], _ ["Tom", "Cliffe"], _ ["Dick", "Harries"], _ ["Harry", "Thompson"], _ ["Tom", "Williams"], _ ["Dick", "Webb"], _ ["Harry", "Manning"], _ ["Tom", "Payne"]] $hGUI = GUICreate("Test", 500, 500) $cLV = GUICtrlCreateListView("Forename |Name ", 10, 10, 400, 300) _LoadArrayToLV($cLV, $aList, 1) $cSort = GUICtrlCreateButton("Sort", 10, 350, 80, 30) GUISetState() While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE Exit Case $cSort _Sort() EndSwitch WEnd Func _Sort() ; Read ListView content into an array Local $aArray = _ReadLVToArray($cLV) _ArrayDisplay($aArray, "Before sort") ; Multisort the array - both columns "Ascending" Local $aSortData[2][2] = [[0, 0], [1, 0]] _ArrayMultiColSort($aArray, $aSortData) _ArrayDisplay($aArray, "After sort") ; Now reload the array into the ListView _LoadArrayToLV($cLV, $aArray) EndFunc Func _LoadArrayToLV($cLV, $aArray, $iStart = 0) ; Delete current items _GUICtrlListView_DeleteAllItems($cLV) ; Load from array For $i = 0 + $iStart To UBound($aArray) - 1 GUICtrlCreateListViewItem($aArray[$i][0] & "|" & $aArray[$i][1], $cLV) Next EndFunc Func _ReadLVToArray($cLV, $iStart = 0) Local $aLVArray = "", $aRow ; Get ListView row count Local $iRows = _GUICtrlListView_GetItemCount($cLV) ; Check for empty ListView with no count If $iRows + $iStart <> 0 Then ; Get ListView column count Local $iCols = _GUICtrlListView_GetColumnCount($cLV) ; Create 2D array to hold ListView content and add count - count overwritten if not needed Local $aLVArray[$iRows + $iStart][$iCols] = [[$iRows]] ; Read ListView content into array For $i = 0 To $iRows - 1 ; Read the row content $aRow = _GUICtrlListView_GetItemTextArray($cLV, $i) For $j = 1 To $aRow[0] ; Add to the ListView content array $aLVArray[$i + $iStart][$j - 1] = $aRow[$j] Next Next EndIf ; Return array or empty string Return $aLVArray EndFuncPlease ask if you any questions. M23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area Link to comment Share on other sites More sharing options...
Reinhardt1julian Posted December 2, 2013 Author Share Posted December 2, 2013 Thank you so much! Is it possible to copy it 1:1 (i know i have to change some variables) or do i have to modify some things? Doesn't look like it. Link to comment Share on other sites More sharing options...
Moderators Melba23 Posted December 2, 2013 Moderators Share Posted December 2, 2013 Reinhardt1julian,You should be able to paste those functions straight into your script. But you know where I am if you run into any problems. M23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area Link to comment Share on other sites More sharing options...
Reinhardt1julian Posted December 2, 2013 Author Share Posted December 2, 2013 Oh, does this also work if there are more colums than the two? But it should only use the first two It looks like it, but I want to make sure... And it's complicated to test right now, because first i have to edity my whole aready made script Link to comment Share on other sites More sharing options...
Moderators Melba23 Posted December 2, 2013 Moderators Share Posted December 2, 2013 Reinhardt1julian' does this also work if there are more colums than the two?It certainly does - just increase the number of elements in the array. This is explained in the UDF header and shown in the UDF example - which is why I wrote them. M23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area Link to comment Share on other sites More sharing options...
Reinhardt1julian Posted December 2, 2013 Author Share Posted December 2, 2013 Yeah, but it should ignore those coulumn in the sorting process. Just sort it using the first two colums and ignore the rest, and put them back sortet into the arraylist. From the UDF example i understood that it uses all columns to sort it. Link to comment Share on other sites More sharing options...
Moderators Melba23 Posted December 2, 2013 Moderators Share Posted December 2, 2013 Reinhardt1julian,No, the [#][0] element defines the column to sort - so the example I gave you would only sort columns 0 and 1 even if there were more than 2. Using this syntax would sort columns 3 and 4 while ignoring 0 and 1:Local $aSortData[2][2] = [[3, 0], [4, 0]]Clearer now? M23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area Link to comment Share on other sites More sharing options...
Reinhardt1julian Posted December 2, 2013 Author Share Posted December 2, 2013 (edited) Mostly. So it needs to be Local $aSortData[6][6] = [[0, 0], [1, 0]] If it has 6 columns but should only sort the first two? BTW, thanks for sacrificing so much time for me I appreciate that! Edited December 2, 2013 by Reinhardt1julian Link to comment Share on other sites More sharing options...
Moderators Melba23 Posted December 2, 2013 Moderators Share Posted December 2, 2013 Reinhardt1julian,No, just this: Local $aSortData[2][2] = [[0, 0], [1, 0]]You really need to learn about 2D arrays! M23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area Link to comment Share on other sites More sharing options...
Reinhardt1julian Posted December 2, 2013 Author Share Posted December 2, 2013 Yeah I do.... But now it takes the LiswViewItem for example Smith|John|Info|07700|900583|B2 4DB |Birmingham And puts it back in as Smith|John Link to comment Share on other sites More sharing options...
Moderators Melba23 Posted December 2, 2013 Moderators Share Posted December 2, 2013 Reinhardt1julian,Please post the code you have and I will see how we can sort it. Remember you did not mention anything about 6 columns when you started this thread - I solved the problem you stated, so moving the goalposts mid-thread is very likely to throw up problems. M23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area Link to comment Share on other sites More sharing options...
Reinhardt1julian Posted December 2, 2013 Author Share Posted December 2, 2013 (edited) I made an example code: expandcollapse popup#include <ListViewConstants.au3> #include <GUIConstantsEx.au3> #include <GuiListView.au3> #include <WindowsConstants.au3> $Form5 = GUICreate("Test", 674, 469, -1, -1) $List1 = GUICtrlCreateListView("Name|Surename|Info|Area Code|Telephone|Postal code|City", 8, 32, 353, 383, -1, BitOR($WS_EX_ACCEPTFILES,$LVS_EX_FULLROWSELECT)) $Button4 = GUICtrlCreateButton("Sort", 368, 232, 75, 25) GUISetState(@SW_SHOW) GUICtrlCreateListViewItem("Parker|Peter|This is info|3418|2154626|B2 4DB|Birmingham", $List1) GUICtrlCreateListViewItem("Louis|Louis|Is a person|4583|7952461|B2 4DB|Birmingham", $List1) GUICtrlCreateListViewItem("Grey|Christian|Is a random name|3419|794413154|B2 4DB|Birmingham", $List1) GUICtrlCreateListViewItem("Williams|John|Is a common name|8465|35415164|B2 4DB|Birmingham", $List1) While 1 $msg = GUIGetMsg() Switch $msg Case $GUI_EVENT_CLOSE Exit Case $Button4 _Sort($List1) EndSwitch WEnd Func _Sort($listview) ; Read ListView content into an array Local $aArray = _ReadLVToArray($listview) ; Multisort the array - both columns "Ascending" Local $aSortData[2][2] = [[0, 0], [1, 0]] _ArrayMultiColSort($aArray, $aSortData) ; Now reload the array into the ListView _LoadArrayToLV($listview, $aArray) EndFunc Func _LoadArrayToLV($cLV, $aArray, $iStart = 0) ; Delete current items _GUICtrlListView_DeleteAllItems($cLV) ; Load from array For $i = 0 + $iStart To UBound($aArray) - 1 GUICtrlCreateListViewItem($aArray[$i][0] & "|" & $aArray[$i][1], $cLV) Next EndFunc Func _ReadLVToArray($cLV, $iStart = 0) Local $aLVArray = "", $aRow ; Get ListView row count Local $iRows = _GUICtrlListView_GetItemCount($cLV) ; Check for empty ListView with no count If $iRows + $iStart <> 0 Then ; Get ListView column count Local $iCols = _GUICtrlListView_GetColumnCount($cLV) ; Create 2D array to hold ListView content and add count - count overwritten if not needed Local $aLVArray[$iRows + $iStart][$iCols] = [[$iRows]] ; Read ListView content into array For $i = 0 To $iRows - 1 ; Read the row content $aRow = _GUICtrlListView_GetItemTextArray($cLV, $i) For $j = 1 To $aRow[0] ; Add to the ListView content array $aLVArray[$i + $iStart][$j - 1] = $aRow[$j] Next Next EndIf ; Return array or empty string Return $aLVArray EndFunc Func _ArrayMultiColSort(ByRef $aArray, $aSortData, $iStart = 0, $iEnd = 0) If UBound($aArray, 2) = 0 Then Return SetError(1, 1, "") EndIf ; 2D sort data If UBound($aSortData, 2) <> 2 Then Return SetError(1, 2, "") EndIf If UBound($aSortData) > UBound($aArray) Then Return SetError(1, 3) EndIf ; Start element If $iStart < 0 Then $iStart = 0 EndIf If $iStart >= UBound($aArray) - 1 Then Return SetError(1, 4, "") EndIf ; End element If $iEnd <= 0 Or $iEnd >= UBound($aArray) - 1 Then $iEnd = UBound($aArray) - 1 EndIf ; Sanity check If $iEnd <= $iStart Then Return SetError(1, 5, "") EndIf Local $iCurrCol, $iChunk_Start, $iMatchCol ; Sort first column __AMCS_SortChunk($aArray, $aSortData, 0, $aSortData[0][0], $iStart, $iEnd) If @error Then Return SetError(2, @extended, "") EndIf ; Now sort within other columns For $iSortData_Row = 1 To UBound($aSortData) - 1 ; Determine column to sort $iCurrCol = $aSortData[$iSortData_Row][0] ; Create arrays to hold data from previous columns Local $aBaseValue[$iSortData_Row] ; Set base values For $i = 0 To $iSortData_Row - 1 $aBaseValue[$i] = $aArray[$iStart][$aSortData[$i][0]] Next ; Set start of this chunk $iChunk_Start = $iStart ; Now work down through array For $iRow = $iStart + 1 To $iEnd ; Match each column For $k = 0 To $iSortData_Row - 1 $iMatchCol = $aSortData[$k][0] ; See if value in each has changed If $aArray[$iRow][$iMatchCol] <> $aBaseValue[$k] Then ; If so and row has advanced If $iChunk_Start < $iRow - 1 Then ; Sort this chunk __AMCS_SortChunk($aArray, $aSortData, $iSortData_Row, $iCurrCol, $iChunk_Start, $iRow - 1) If @error Then Return SetError(2, @extended, "") EndIf EndIf ; Set new base value $aBaseValue[$k] = $aArray[$iRow][$iMatchCol] ; Set new chunk start $iChunk_Start = $iRow EndIf Next Next ; Sort final section If $iChunk_Start < $iRow - 1 Then __AMCS_SortChunk($aArray, $aSortData, $iSortData_Row, $iCurrCol, $iChunk_Start, $iRow - 1) If @error Then Return SetError(2, @extended, "") EndIf EndIf Next EndFunc ;==>_ArrayMultiColSort Func __AMCS_SortChunk(ByRef $aArray, $aSortData, $iRow, $iColumn, $iChunkStart, $iChunkEnd) Local $aSortOrder ; Set default sort direction Local $iSortDirn = 1 ; Need to prefix elements? If IsString($aSortData[$iRow][1]) Then ; Split elements $aSortOrder = StringSplit($aSortData[$iRow][1], ",") If @error Then Return SetError(1, 1, "") EndIf ; Add prefix to each element For $i = $iChunkStart To $iChunkEnd For $j = 1 To $aSortOrder[0] If $aArray[$i][$iColumn] = $aSortOrder[$j] Then $aArray[$i][$iColumn] = StringFormat("%02i-", $j) & $aArray[$i][$iColumn] ExitLoop EndIf Next ; Deal with anything that does not match If $j > $aSortOrder[0] Then $aArray[$i][$iColumn] = StringFormat("%02i-", $j) & $aArray[$i][$iColumn] EndIf Next Else Switch $aSortData[$iRow][1] Case 0, 1 ; Set required sort direction if no list If $aSortData[$iRow][1] Then $iSortDirn = -1 Else $iSortDirn = 1 EndIf Case Else Return SetError(1, 2, "") EndSwitch EndIf ; Sort the chunk Local $iSubMax = UBound($aArray, 2) - 1 __ArrayQuickSort2D($aArray, $iSortDirn, $iChunkStart, $iChunkEnd, $iColumn, $iSubMax) ; Remove any prefixes If IsString($aSortData[$iRow][1]) Then For $i = $iChunkStart To $iChunkEnd $aArray[$i][$iColumn] = StringTrimLeft($aArray[$i][$iColumn], 3) Next EndIf EndFunc ;==>__AMCS_SortChunk Edited December 2, 2013 by Reinhardt1julian Link to comment Share on other sites More sharing options...
Moderators Melba23 Posted December 2, 2013 Moderators Share Posted December 2, 2013 Reinhardt1julian,That was easy to fix: expandcollapse popup#include <ListViewConstants.au3> #include <GUIConstantsEx.au3> #include <GuiListView.au3> #include <WindowsConstants.au3> $Form5 = GUICreate("Test", 674, 469, -1, -1) $List1 = GUICtrlCreateListView("Name|Surename|Info|Area Code|Telephone|Postal code|City", 8, 32, 353, 383, -1, BitOR($WS_EX_ACCEPTFILES, $LVS_EX_FULLROWSELECT)) $Button4 = GUICtrlCreateButton("Sort", 368, 232, 75, 25) GUISetState(@SW_SHOW) GUICtrlCreateListViewItem("Parker|Peter|This is info|3418|2154626|B2 4DB|Birmingham", $List1) GUICtrlCreateListViewItem("Louis|Louis|Is a person|4583|7952461|B2 4DB|Birmingham", $List1) GUICtrlCreateListViewItem("Grey|Christian|Is a random name|3419|794413154|B2 4DB|Birmingham", $List1) GUICtrlCreateListViewItem("Williams|John|Is a common name|8465|35415164|B2 4DB|Birmingham", $List1) GUICtrlCreateListViewItem("Parker|John|Is a common name|8465|35415164|B2 4DB|Birmingham", $List1) While 1 $msg = GUIGetMsg() Switch $msg Case $GUI_EVENT_CLOSE Exit Case $Button4 _Sort($List1) EndSwitch WEnd Func _Sort($listview) ; Read ListView content into an array Local $aArray = _ReadLVToArray($listview) ; Multisort the array - both columns "Ascending" Local $aSortData[2][2] = [[0, 0],[1, 0]] _ArrayMultiColSort($aArray, $aSortData) ; Now reload the array into the ListView _LoadArrayToLV($listview, $aArray) EndFunc ;==>_Sort Func _LoadArrayToLV($cLV, $aArray, $iStart = 0) ; Delete current items _GUICtrlListView_DeleteAllItems($cLV) ; Load from array For $i = 0 + $iStart To UBound($aArray) - 1 $sItem = "" For $j = 0 To UBound($aArray, 2) - 1 ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< $sItem &= $aArray[$i][$j] & "|" Next $sItem = StringTrimRight($sItem, 1) GUICtrlCreateListViewItem($sItem, $cLV) Next EndFunc ;==>_LoadArrayToLV Func _ReadLVToArray($cLV, $iStart = 0) Local $aLVArray = "", $aRow ; Get ListView row count Local $iRows = _GUICtrlListView_GetItemCount($cLV) ; Check for empty ListView with no count If $iRows + $iStart <> 0 Then ; Get ListView column count Local $iCols = _GUICtrlListView_GetColumnCount($cLV) ; Create 2D array to hold ListView content and add count - count overwritten if not needed Local $aLVArray[$iRows + $iStart][$iCols] = [[$iRows]] ; Read ListView content into array For $i = 0 To $iRows - 1 ; Read the row content $aRow = _GUICtrlListView_GetItemTextArray($cLV, $i) For $j = 1 To $aRow[0] ; Add to the ListView content array $aLVArray[$i + $iStart][$j - 1] = $aRow[$j] Next Next EndIf ; Return array or empty string Return $aLVArray EndFunc ;==>_ReadLVToArray Func _ArrayMultiColSort(ByRef $aArray, $aSortData, $iStart = 0, $iEnd = 0) If UBound($aArray, 2) = 0 Then Return SetError(1, 1, "") EndIf ; 2D sort data If UBound($aSortData, 2) <> 2 Then Return SetError(1, 2, "") EndIf If UBound($aSortData) > UBound($aArray) Then Return SetError(1, 3) EndIf ; Start element If $iStart < 0 Then $iStart = 0 EndIf If $iStart >= UBound($aArray) - 1 Then Return SetError(1, 4, "") EndIf ; End element If $iEnd <= 0 Or $iEnd >= UBound($aArray) - 1 Then $iEnd = UBound($aArray) - 1 EndIf ; Sanity check If $iEnd <= $iStart Then Return SetError(1, 5, "") EndIf Local $iCurrCol, $iChunk_Start, $iMatchCol ; Sort first column __AMCS_SortChunk($aArray, $aSortData, 0, $aSortData[0][0], $iStart, $iEnd) If @error Then Return SetError(2, @extended, "") EndIf ; Now sort within other columns For $iSortData_Row = 1 To UBound($aSortData) - 1 ; Determine column to sort $iCurrCol = $aSortData[$iSortData_Row][0] ; Create arrays to hold data from previous columns Local $aBaseValue[$iSortData_Row] ; Set base values For $i = 0 To $iSortData_Row - 1 $aBaseValue[$i] = $aArray[$iStart][$aSortData[$i][0]] Next ; Set start of this chunk $iChunk_Start = $iStart ; Now work down through array For $iRow = $iStart + 1 To $iEnd ; Match each column For $k = 0 To $iSortData_Row - 1 $iMatchCol = $aSortData[$k][0] ; See if value in each has changed If $aArray[$iRow][$iMatchCol] <> $aBaseValue[$k] Then ; If so and row has advanced If $iChunk_Start < $iRow - 1 Then ; Sort this chunk __AMCS_SortChunk($aArray, $aSortData, $iSortData_Row, $iCurrCol, $iChunk_Start, $iRow - 1) If @error Then Return SetError(2, @extended, "") EndIf EndIf ; Set new base value $aBaseValue[$k] = $aArray[$iRow][$iMatchCol] ; Set new chunk start $iChunk_Start = $iRow EndIf Next Next ; Sort final section If $iChunk_Start < $iRow - 1 Then __AMCS_SortChunk($aArray, $aSortData, $iSortData_Row, $iCurrCol, $iChunk_Start, $iRow - 1) If @error Then Return SetError(2, @extended, "") EndIf EndIf Next EndFunc ;==>_ArrayMultiColSort Func __AMCS_SortChunk(ByRef $aArray, $aSortData, $iRow, $iColumn, $iChunkStart, $iChunkEnd) Local $aSortOrder ; Set default sort direction Local $iSortDirn = 1 ; Need to prefix elements? If IsString($aSortData[$iRow][1]) Then ; Split elements $aSortOrder = StringSplit($aSortData[$iRow][1], ",") If @error Then Return SetError(1, 1, "") EndIf ; Add prefix to each element For $i = $iChunkStart To $iChunkEnd For $j = 1 To $aSortOrder[0] If $aArray[$i][$iColumn] = $aSortOrder[$j] Then $aArray[$i][$iColumn] = StringFormat("%02i-", $j) & $aArray[$i][$iColumn] ExitLoop EndIf Next ; Deal with anything that does not match If $j > $aSortOrder[0] Then $aArray[$i][$iColumn] = StringFormat("%02i-", $j) & $aArray[$i][$iColumn] EndIf Next Else Switch $aSortData[$iRow][1] Case 0, 1 ; Set required sort direction if no list If $aSortData[$iRow][1] Then $iSortDirn = -1 Else $iSortDirn = 1 EndIf Case Else Return SetError(1, 2, "") EndSwitch EndIf ; Sort the chunk Local $iSubMax = UBound($aArray, 2) - 1 __ArrayQuickSort2D($aArray, $iSortDirn, $iChunkStart, $iChunkEnd, $iColumn, $iSubMax) ; Remove any prefixes If IsString($aSortData[$iRow][1]) Then For $i = $iChunkStart To $iChunkEnd $aArray[$i][$iColumn] = StringTrimLeft($aArray[$i][$iColumn], 3) Next EndIf EndFunc ;==>__AMCS_SortChunkI am just off to cook dinner now - any questions will have to wait until later this evening. M23 Reinhardt1julian 1 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area Link to comment Share on other sites More sharing options...
Moderators Melba23 Posted December 2, 2013 Moderators Share Posted December 2, 2013 Reinhardt1julian,Now I am fed and watered, did you get it to work as you wanted? M23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area 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