从 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