数据库查询后列表视图展示:部门筛选后数据入列表技术求助
解决ListView填充数据库查询结果的问题
我来帮你搞定把ADODB查询结果填充到ListView的问题!你的下拉框筛选逻辑已经搭好了,接下来只需要把查询到的记录集逐条添加到ListView里就行,下面是具体的步骤和修改后的代码:
第一步:先给ListView配置好列(必做)
首先得确保你的ListView已经设置了对应查询字段的列,而且要把它改成报表模式(不然列和内容都不会正常显示)。你可以在窗体加载的时候添加这段代码:
Private Sub Form_Load() ' 给ListView添加列,对应你查询的每个字段(调整宽度和名称到你需要的样子) ListView1.ColumnHeaders.Add , , "PO编号", 100 ListView1.ColumnHeaders.Add , , "申请人", 120 ListView1.ColumnHeaders.Add , , "申请部门", 120 ListView1.ColumnHeaders.Add , , "状态", 80 ListView1.ColumnHeaders.Add , , "审批人", 100 ' 关键:设置ListView为报表视图,这样列和子项才会显示 ListView1.View = lvwReport End Sub
第二步:修改你的下拉框点击事件,填充数据
接下来把你的comboDept_Click代码补充完整,加上遍历记录集、填充ListView的逻辑,还要注意清空旧数据和资源释放:
Private Sub comboDept_Click() Dim sQuery As String Dim oRS As New ADODB.Recordset Dim combVal As String Dim listItem As ListItem ' 用来创建ListView的每一行 Dim cnn As New ADODB.Connection ' 如果没有全局连接对象,这里创建 ' 获取选中的部门值 combVal = comboDept.List(comboDept.ListIndex) ' 先清空ListView的旧数据,避免叠加 ListView1.ListItems.Clear ' 1. 先打开数据库连接(替换成你的实际连接字符串) cnn.Open "Provider=SQLOLEDB;Data Source=你的服务器名;Initial Catalog=你的数据库名;User ID=用户名;Password=密码;" ' 2. 构建查询语句(补全你的表名和字段,这里假设完整的查询条件) If combVal = "EIBU_SALES" Then sQuery = "SELECT PO_No, PO_Requestor, PO_Req_Dept, PO_Status, PO_Approver FROM 你的表名 WHERE PO_Req_Dept = '" & combVal & "'" Else ' 如果有其他部门的筛选逻辑,这里可以补充 sQuery = "SELECT PO_No, PO_Requestor, PO_Req_Dept, PO_Status, PO_Approver FROM 你的表名 WHERE PO_Req_Dept = '" & combVal & "'" End If ' 错误处理,防止程序崩溃 On Error GoTo ErrorHandler ' 3. 执行查询,打开记录集 oRS.Open sQuery, cnn, adOpenStatic, adLockReadOnly ' 4. 遍历记录集,逐条添加到ListView Do While Not oRS.EOF ' 创建新行,第一列用PO_No作为行标题 Set listItem = ListView1.ListItems.Add(, , oRS("PO_No").Value) ' 给后续列赋值(SubItems的索引从1开始,对应第二列及以后) listItem.SubItems(1) = oRS("PO_Requestor").Value listItem.SubItems(2) = oRS("PO_Req_Dept").Value listItem.SubItems(3) = oRS("PO_Status").Value listItem.SubItems(4) = oRS("PO_Approver").Value ' 移动到下一条记录 oRS.MoveNext Loop Cleanup: ' 5. 释放资源,避免内存泄漏 If Not oRS Is Nothing Then If oRS.State = adStateOpen Then oRS.Close Set oRS = Nothing End If If Not cnn Is Nothing Then If cnn.State = adStateOpen Then cnn.Close Set cnn = Nothing End If Exit Sub ErrorHandler: MsgBox "数据加载出错:" & Err.Description, vbExclamation Resume Cleanup End Sub
几个关键注意点
- 视图模式:一定要把ListView的
View设为lvwReport,否则列和子项都不会显示出来。 - 清空旧数据:每次筛选前调用
ListView1.ListItems.Clear,不然新数据会和旧数据混在一起。 - 资源释放:用完Recordset和Connection后一定要关闭并设置为
Nothing,这是VB6里防止内存泄漏的好习惯。 - 错误处理:加上
On Error GoTo逻辑,能帮你快速定位查询或连接时的问题。
内容的提问来源于stack exchange,提问作者zhanwei yap
相关产品推荐
相关产品推荐

