If lstFactory.ItemsSelected.Count > 0 Then
For Each temp In lstFactory.ItemsSelected
result = result & " (ID = " & lstFactory.ItemData(temp) & ") OR"
Next temp
DoCmd.OpenReport "rptFactory", acViewPreview, , , , Left(result, Len(result) - 3)
Else.......
上面语句中 If lstFactory.ItemsSelected.Count > 0 用来判断是否在列表框中作了选择(如果没有任何选择那么其值为0),如果有选择的话,那么:
For Each temp In lstFactory.ItemsSelected 即是对每个选择了的项目依次循环,然后组成一个sql语句的where部分保存到result中。例如选择了id为3和5的工厂,那么最后result中的结果就是 "(ID=3) OR (ID=5) OR"
Left(result, Len(result) - 3)的运算结果就变成"(ID=3) OR (ID=5)",这个就是我们要送到报表去打印的。
再看报表的open事件,如果有参数传入,例如"(ID=3) OR (ID=5)",那么就决定报表的数据源为
Private Sub lstFactory_DblClick(Cancel As Integer)
With lstFactory
If .ItemsSelected.Count > 0 Then
lstPrint.AddItem (.Column(0, .ItemsSelected(0)) & ";" & .Column(1, .ItemsSelected(0)))
.RemoveItem (.ItemsSelected(0))
End If
End With
End Sub
将with...end with块去掉,可以看清楚些
Private Sub lstFactory_DblClick(Cancel As Integer)
If lstFactory.ItemsSelected.Count > 0 Then
lstPrint.AddItem (lstFactory.Column(0, lstFactory.ItemsSelected(0)) & ";" & .Column(1, lstFactory.ItemsSelected(0)))
lstFactory.RemoveItem (lstFactory.ItemsSelected(0))
End If
End Sub
重要的是If块里面的两句,解释如下
第一句 lstPrint.AddItem (lstFactory.Column(0, lstFactory.ItemsSelected) & ";" & .Column(1, lstFactory.ItemsSelected)):将lstFactory选择的项目添加到lstPrint中。
第二句 lstFactory.RemoveItem (lstFactory.ItemsSelected(0)):将lstFactory选择的项目删除。
lstFactory.ItemsSelected(0)表示第一个选择的项目,其值是那个项目的行号(行号从0开始)。例如选择了第三行,那么这个值就是2。listbox里面某条的具体内容(如工厂id和工厂名称),用法是
listbox.Column(列号,行号)。列号和行号都是从0开始。所以,假定选择了第三行,那么lstFactory的第一列(现为隐藏列)(lstFactory.Column(0, lstFactory.ItemsSelected(0)) 即lstFactory.Column(0,2),第三行的第二列(现为工厂名称)就是lstFactory.Column(1,2)
现在将工厂id和工厂名称组合成 "id; fname"这样的形式添加到lstPrint的末尾,这就是第一句的全部含义了。
要深入了解listbox(以及combobox)的一些属性方法,建议查看帮助文档及其示例。