我对此有点过分了。我目前正在开发一个用户表单,可以从表中添加,更新和删除记录。
我遇到了删除功能的问题。当它删除所选记录时,它会复制表中的最后一条记录,以便记录数保持不变。
以下是具体代码,c_01指的是包含每个条目的唯一标识符的组合框。
删除功能:
function :: (Int, Int) -> [[Int]] -> Int
function (s, d) matrix = inner (s, d) matrix
where
inner (i, 0) g = g !! (i-1) !! (0)
inner (i, k) g = maximum [memo ! ((i, k-1), g)
,
memo ! ((i-1, k), g)
]
memo = listArray bounds
[inner (i,k) g | ((i,k), g) <- Data.Array.range bounds]
bounds = ( ((1,1), [[1,1]]), ((n,n), [[n,n]]) )
保存功能:
Private Sub B_02_Click() ' Delete
With c_01
.RemoveItem .ListIndex
If .ListCount > 0 Then .ListIndex = 0
If .ListIndex = -1 Then
For j = 0 To UBound(.List, 2)
Me("T_" & Format(j, "00")) = ""
Me("T_" & Format(j, "00")).Locked = True
Next
.Value = ""
End If
End With
End Sub
关于为什么这会创建最后一条记录的副本而不仅仅是删除指定记录的任何提示都会有所帮助。
如果您需要完整代码或Userform的屏幕截图,我可以提供。
答案 0 :(得分:1)
没有重复的行为 - 只清除所有行
您不仅要[0]将组合框数据写入重新定义的范围,您还必须[1]调整listobject范围的大小,并[2]清除以下行;否则旧数据只会被部分覆盖。
示例代码
Private Sub B_03_Click() ' Save
With Sheets("Data").ListObjects(1)
.ShowTotals = False
If C_01.ListCount = 0 Then .DataBodyRange.ClearContents
If C_01.ListCount > 0 Then
' [0] Write combobox values
.DataBodyRange.Resize(C_01.ListCount).Value = C_01.List
' [1] Resize listobject range
.Resize .Range.Resize(C_01.ListCount + 1) ' << resize listobject including header (+1), too
' [2] Suggestion to clear at least some lines below as well
.Range.Offset(.Range.Rows.Count).ClearContents ' << clear lines after listobject table
End If
.ShowTotals = True
End With
Hide
End Sub