Sort a ListViewGadget -- How to?
Posted: Wed Nov 05, 2025 1:53 am
I was hoping for maybe a one step API to sort my listViewGadget but cannot find if it exists. Any simple way to sort a populated listViewGadget?
http://www.purebasic.com
https://www.purebasic.fr/english/
Code: Select all
Global Dim Lvitems.s(20)
For a = 0 To 19
lvitems.s(a) = "item:" + RSet(Str(19-a),3,"0")
Next
Procedure sortlisview(gadget)
SortArray(lvitems(),#PB_Sort_Ascending | #PB_Sort_NoCase)
For a = 0 To ArraySize(lvitems())
SetGadgetItemText(gadget,a-1,Lvitems(a))
Next
EndProcedure
If OpenWindow(0, 0, 0, 270, 140, "ListViewGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListViewGadget(0, 10, 10, 250, 120)
For a = 0 To ArraySize(lvitems())
AddGadgetItem (0, -1, lvitems(a)) ; define listview content
Next
sortlisview(0)
SetGadgetState(0, 9) ; set (beginning with 0) the tenth item as the active one
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Code: Select all
OpenWindow(0, 0, 0, 800,600, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListViewGadget(0, 10, 10, 780, 500, #LBS_SORT | #LBS_NOINTEGRALHEIGHT | #LBS_HASSTRINGS)
StringGadget(1, 10, 515, 400, 24, "")
ButtonGadget(2, 10, 542, 160, 24, "Add Item")
ButtonGadget(3, 10, 570, 160, 24, "Sort Items")
AddGadgetItem(0,-1,"My new item")
AddGadgetItem(0,-1,"Any new item")
AddGadgetItem(0,-1,"For test")
SetActiveGadget(0)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Quit = 1
Case #PB_Event_Gadget
Select EventGadget()
Case 2
String$ = GetGadgetText(1)
SendMessage_(GadgetID(0), #LB_ADDSTRING, 0, string$)
SetGadgetText(1, "")
SetActiveGadget(0)
Case 3
For item = 0 To CountGadgetItems(0)
SendMessage_(GadgetID(0), #LB_ADDSTRING, 0, GetGadgetItemText(0,0))
RemoveGadgetItem(0,0)
Next
EndSelect
EndSelect
Until Quit = 1
End
Code: Select all
OpenWindow(0, 0, 0, 800,600, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListViewGadget(0, 10, 10, 780, 500, #LBS_SORT | #LBS_NOINTEGRALHEIGHT | #LBS_HASSTRINGS)
ListViewGadget(1, -800, 10, 385, 500, #LBS_SORT | #LBS_NOINTEGRALHEIGHT | #LBS_HASSTRINGS) ;dummy ListView
StringGadget(2, 10, 515, 400, 24, "")
ButtonGadget(3, 10, 542, 160, 24, "Add Item")
ButtonGadget(4, 10, 570, 160, 24, "Sort Items")
AddGadgetItem(0,-1,"My new item")
AddGadgetItem(0,-1,"Any new item")
AddGadgetItem(0,-1,"X For test")
AddGadgetItem(0,-1,"Q For test")
AddGadgetItem(0,-1,"9 For test")
AddGadgetItem(0,-1,"1 For test")
SetActiveGadget(0)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Quit = 1
Case #PB_Event_Gadget
Select EventGadget()
Case 3
String$ = GetGadgetText(2)
SendMessage_(GadgetID(0), #LB_ADDSTRING, 0, string$)
SetGadgetText(2, "")
SetActiveGadget(0)
Case 4
For item = 0 To CountGadgetItems(0)-1
SendMessage_(GadgetID(1), #LB_ADDSTRING, item , GetGadgetItemText(0,item))
Next
ClearGadgetItems(0)
For item = 0 To CountGadgetItems(1)-1
SendMessage_(GadgetID(0), #LB_ADDSTRING, 0 , GetGadgetItemText(1,item))
Next
FreeGadget(1)
EndSelect
EndSelect
Until Quit = 1
End
I don't understand how it works, but it does perfectly.
Code: Select all
Enumeration
#MainForm
#MainList
#Filters
#Tri
EndEnumeration
UseSQLiteDatabase()
Global DB = OpenDatabase(#PB_Any, ":memory:", "", "", #PB_Database_SQLite)
Procedure CreateTable()
Protected query.s
query = "CREATE TABLE client ("
query + "name TEXT)"
If DatabaseUpdate(DB, query) = 0
MessageRequester("Database Error", "Can not create table")
ProcedureReturn #False
EndIf
ProcedureReturn #True
EndProcedure
Procedure FillTable(name.s)
Protected query.s
query = "INSERT INTO client ("
query + "name) VALUES (" + Chr(34) + name + Chr(34) + ")"
If DatabaseUpdate(DB, query) = 0
MessageRequester("Database Error", DatabaseError())
ProcedureReturn #False
EndIf
ProcedureReturn #True
EndProcedure
Procedure MakeClient()
FillTable("Grumeaux")
FillTable("Maurico")
FillTable("Grosard")
FillTable("Foulard")
FillTable("Faulard")
FillTable("Faumard")
EndProcedure
Procedure FillList()
Protected Filters.s = GetGadgetText(#Filters)
Protected query.s
query = "SELECT name FROM client"
; Si il y à un filtre je l'ajoute
If Filters <> ""
query + " WHERE name LIKE '" + Filters + "%'"
EndIf
If DatabaseQuery(DB, query) = 0
MessageRequester("Database Error", DatabaseError())
ProcedureReturn #False
EndIf
ClearGadgetItems(#MainList)
While NextDatabaseRow(DB)
AddGadgetItem(#MainList, - 1, GetDatabaseString(DB, 0))
Wend
EndProcedure
Procedure SortMe()
; DatabaseQuery(DB, "Select * From client Order By Substr(name, 1, 1), Cast(Substr(name, 2, 10) As Int)"); ex; A1 A2 A10
DatabaseQuery(DB, "Select * From client Order By name ASC"); ex; A1 A10 A2
ClearGadgetItems(#MainList)
While NextDatabaseRow(DB)
AddGadgetItem(#MainList, - 1, GetDatabaseString(DB, 0))
Wend
EndProcedure
Procedure Exit()
End
EndProcedure
CreateTable()
MakeClient()
Define flag = #PB_Window_SystemMenu | #PB_Window_ScreenCentered
Define X = 10, Y = 10, WF = 800, HF = 600
OpenWindow(#MainForm, 0, 0, WF, HF, "Test filtre", flag)
TextGadget(#PB_Any, X, Y, 100, 30, "Filtre:")
Y + 20
StringGadget(#Filters, X, Y, 100, 30, "")
ButtonGadget(#Tri, 150, Y, 60, 30, "Sort")
Y + 40
ListViewGadget(#MainList, X, Y, WF - 20, HF - (Y + 10))
BindEvent(#PB_Event_CloseWindow, @Exit(), #MainForm)
BindGadgetEvent(#Filters, @FillList())
BindGadgetEvent(#Tri, @SortMe())
FillList()
; MainLoop
Repeat:WaitWindowEvent():ForEver
Hey that's pretty good. A little overkill maybe.