我已经在Google上进行了广泛的搜索,询问了我的同事,甚至尝试创建替代方法代码。我尝试更改列表框的名称并创建一个新列表框。
我在用户窗体上有一个名为lbx_genoutages的列表框。我想获取选择的行号。即使选择了某项,它也会始终返回负一(-1)。
它唯一有效的时间是我选择了第一条记录(记录0)。
以下是其错误所在的代码行:
listboxId = Me.lbx_genoutages.List(Me.lbx_genoutages.ListIndex, 0)
我尝试将“ me”更改为用户表单的名称。我已附加了列表框的图像,其中显示了选定的内容,但仍然显示错误。我还仔细检查了列表框的名称是否正确拼写,等等。
这适用于同一程序中其他用户窗体上的其他列表框。我比较了两个列表框的属性,但没有任何区别。
以下是在初始化用户表单时填充列表框的代码:
frm_dbGenBrowser.lbx_genoutages.Clear
frm_dbGenBrowser.lbx_genoutages.ColumnCount = 8
frm_dbGenBrowser.lbx_genoutages.ColumnWidths = "0, 40, 40, 40, 40, 60, 70, 50"
If q = "" Then 'query could be already filled if specified when this sub was called. This is used for sorting.
q = "SELECT * FROM SLA_Generators as s left join (list_lcc as l) on s.sg_lcc = l.id" & _
" WHERE SG_deleted = No " & _
" AND SG_outDate <= #" & frm_dbGenBrowser.DTPicker2.Value & "# " & _
" AND SG_retDate >= #" & frm_dbGenBrowser.DTPicker1.Value & "# " & _
" ORDER BY " & orderby
End If
Set rs = con.Execute(q)
Do Until rs.EOF 'for each outage, add it into the list
If rs.Fields("SG_isOutage").Value = True Then partialOutage = "" Else partialOutage = " *"
With frm_dbGenBrowser.lbx_genoutages
.addItem
.List(i, 0) = rs.Fields("s.ID").Value
.List(i, 2) = nz(rs.Fields("lccname").Value, "")
.List(i, 1) = rs.Fields("SG_unit").Value
.List(i, 3) = rs.Fields("SG_reduction").Value & partialOutage
.List(i, 4) = IIf(rs.Fields("SG_dailyReport").Value = True, "Y", "N")
.List(i, 5) = rs.Fields("SG_outDate").Value
.List(i, 6) = rs.Fields("SG_retDate").Value
If Len(rs.Fields("SG_reason")) > 0 Then
.List(i, 7) = rs.Fields("SG_reason").Value
Else
.List(i, 7) = ""
End If
If rs.Fields("s.ID").Value = outageId Then .ListIndex = i
End With
rs.MoveNext
i = i + 1
Loop
答案 0 :(得分:0)
您正在以某种方式处理两个实例。
大概是您在表单的默认实例上填充列表框:
frm_dbGenBrowser.lbx_genoutages.Clear frm_dbGenBrowser.lbx_genoutages.ColumnCount = 8 frm_dbGenBrowser.lbx_genoutages.ColumnWidths = "0, 40, 40, 40, 40, 60, 70, 50"
但是您没有显示那个实例:
With New frm_dbGenBrowser
.Show
End With
当上面的(正确的)代码运行时,所有引用默认实例的东西(即,使用表单的名称而不是Me
/当前实例)都发生在以下情况上,显示但在内存中无关的实例,您会得到-1
,因为实际上在该实例上没有选择任何东西。
表单是对象,如您所见,不能将表单这么快地对待就容易产生错误和混乱。
避免在其自身的代码后方引用表单的默认实例。使用Me
而不是表单的类名,无论您是针对默认实例还是针对.Show
实例运行New
,问题都会消失。
经验法则,请避免使用任何类(包括表单类)的有状态默认实例。有关更多信息,请参见UserForm1.Show(免责声明:我写了该文章)。