從 Zip/上下文選單程式設計 Gambas
當您右鍵單擊 tableview 時,還有另一種方法可以建立上下文選單:不是像我們所做的那樣在程式碼中建立,而是在設計時建立。您仍然需要編寫程式碼來處理選單項單擊事件,但您避免了所有類似於 mn = New Menu(Me) 和 su = New Menu(mn) As "MenuCopyTable" 的 New Menuitem 語句。只需使用選單編輯器建立一個包含所有選單項的新選單即可。此選單將出現在選單欄上,因此要避免這種情況,請將其設為不可見(請參見下面的 Visible 複選框)。
這是建立上下文選單的一種更簡單的方法。如果您在啟動應用程式之前就知道選單是什麼樣子,它將起作用。如果您需要根據輸入的內容來建立選單,則必須在程式碼中建立選單並使用 New 運算子。
沒有內建的排序功能。我希望每個 TableView 都附帶一個方法,例如 TableView_Sort(Column, Direction, NumericOrNot),但實際上沒有。線上維基上有一個很好的排序方法,這裡,但遺憾的是,它對包含數字的列排序不正確。例如,10 在 2 之前,因為“1”在字典中位於“2”之前。字串“10”小於字串“2”,即使數字十大於數字二。
(感謝論壇的 fgores、Lee Davidson 和 Gianluigi 提供的此方法。)
因此,這是我的方法——有點原始,但它有效。想法是遍歷 tableview 的每一行,將該行中的單元格收集到一個字串中,並在每個單元格之間新增一個分隔符,並將決定排序順序的項放在每個字串的開頭。對陣列進行排序,然後將每一行解包回 tableview。換句話說,將每一行打包到一個字串中,對字串進行排序,然後解包每一行。使用任何罕見且不尋常的字元作為欄位分隔符。這裡使用波浪號 (~)。
Public Sub tv1_ColumnClick(Column As Integer)
tv1.Save 'Calls the Save event in case the user clicked col heading without pressing Enter
SortTable(tv1, Column, tv1.Columns.Ascending, (Column = 1))
End
Public Sub SortTable(TheTable As TableView, Column As Integer, Ascending As Boolean, Numeric As Boolean)
Dim z As New String[]
Dim y As New String[]
Dim s As String
Dim i, j As Integer
For i = 0 To TheTable.Rows.Max
If Numeric Then
s = TheTable[i, Column].text 'next line pads it with leading zeros
s = String$(5 - Len(s), "0") 'So 23 becomes 00023, for example. Works up to 99999
Else
s = TheTable[i, Column].text
Endif
For j = 0 To TheTable.Columns.Max
s &= "~" & TheTable[i, j].text
Next
z.add(s)
Next
If Ascending Then z.Sort(gb.Ascent) Else z.Sort(gb.Descent) 'sort
For i = 0 To z.Max 'unpack the array
y = Split(z[i], "~")
For j = 1 To y.Max 'skip the first item, which is the sort key
TheTable[i, j - 1].text = y[j] 'but fill the first column
Next
Next
End