VB ListView的使用
参考网站: http://blog.sina.com.cn/s/blog_61090e890100gipa.html ListView控件比前面几种控件要复杂一些,通过此控件,可将项目组成带有或不带有列标头的列,并显示伴随的图标和文本。ListView控件是由ColumnHeader和ListItem对象所组成的,其中ColumnHeader对象的个数决定了控件的列数,而ListItem对象的个数则决定了控件的行数。(图7) ColumnHeader对象的SubItemIndex属性 ColumnHeader对象的Add方法 ListItem对象的SubItems属性 ListItem对象的Add方法 ListItem1.Add(index,icon,smallIcon) ListView控件的View属性 Private Sub Form_load() Private Sub ListView1_ColumnClick(ByVal ColumnHeader AsComctlLib.ColumnHeader) 一、ListView使用简介 大家可以看到图中所示的界面非常类似于Window95/98的资源浏览器,Windows的界面风格做为一种标准已为广大用户所接受。而Windows操作系统的主要的优点就是为所有的应用程序提供了公用的界面。知道如何使用基于Windows的应用程序的用户,很容易学会使用其他应用程序。 这种使用Windows95公共控件组合的方法能够达到与Windows界面的一致性,所以在目前VB5.0应用程序的开发中经常使用。 二、填充大量结果集所遇到的问题 DoEvents函数的功能是:转让控制权,以便让操作系统处理其它的事件。这样在长时间的查询过程中,如果用户按了Escape键,将退出循环 体,结束查询过程。 但是这样又会引发另外一个问题:由于DoEvents可以让操作系统响应别的事件,循环体中填充每一条ListView项目(ListItem)的过程也会显示出来,所以在填充的过程中屏幕会不停的闪动,这种现象当然不能被用户所接受。如何 解决这个问题呢? 三、解决方案 此函数的功能是获得一个指定对象窗口(Window) 的矩型框区域(rectangle)。 Hwnd为指定对象或窗体的句柄。LpRect为返回矩 型框的结构(必须定义为结构类型的变量)。 2.ValidateRect Lib "user32" (ByVal hwnd As Long,lpRect AsRECT) As Long 此函数的功能是使指定的矩型区域生效。这样会 通知Windows不必对指定的区域进行重画(Redraw)。 3.InvalidateRect Lib "user32" (ByVal hwnd As Long,lpRect AsRECT,ByVal bErase As Long) As Long 此函数的功能是使指定的矩型区域无效。这样会 通知Windows要对指定的区域进行重画。 具体实现的步骤如下: 1.在填充结果集之前先用GetClientRect函数获 得ListView的显示区域。 2.在增加完一个显示项目(ListItem)后用ValidateRect函数置这一区域为有效。这样Windows就不会显示每一条ListItem,屏幕闪动的现象就会消 失。 3.在填充结果集之后,用InvalidateRect函数置这一区域为无效。这样Windows就会重画ListView的内容,结果集被完整的显示出来。 下面是笔者在项目开发中的一个程序实例。程序名为FillListView。该程序将填写一个Access数据库(FISCAL.MDB)的凭证表(Table)的内容到ListView中。 首先进入VB5.0,新建一个窗体(Form),名为Form1。 然后在Form中增加下列控件。
ListView Lvw Imagelist imlList Command Button。 Command1
在<<工程>>菜单命令条中进入“引用”对话框,选择“MicrosoftDAOObjectLibrar 在Form的通用模块(Modle)中定义以下变量。 Private Type RECT ' 用 来 定 义 一 个 区 域 的 坐 标。 Left As Long Top As Long Right As Long Bottom As Long End Type ' - - ' Windows API 函 数 的 声 明。 Private Declare Function InvalidateRect Lib "user32" (ByVal hwnd As Long,lpRect As RECT,ByVal bErase As Long) AsLong Private Declare Function ValidateRect Lib "user32" (ByVal hwnd As Long,lpRect As RECT) As Long Private Declare Function GetClientRect Lib "user32" (ByVal hwnd As Long,lpRect As RECT) As Long
' 用 来 定 义 查 询 中 断 的 标 志。 ' True 表 示 中 止 查 询;False 表 示 正 在 查 询。
然 后 在Form 的KeyPress 事 件 中 写 下 列 代 码:
mbSearchCancel = True ' 当 用 户 按Escape 键 时, 置mbSearchCancel 变 量 为True。 End If ' 表 示 结 束 查 询。 在Command Button 的 Click 事 件 中 调 用 填 充 子 程 序:CallFillListView。
Private Sub FillListView() ' Dim itmX As ListItem ' 定 义 一 个ListView 的 显 示 项 目。 Dim sSQL As String ' 查 询 字 串 变 量 。 ' Dim rc As RECT ' ListView 的 显 示 区 域。 Dim wrkJet As Workspace ' 数 据 库 工 作 空 间。 Dim dbFISCAL As Database ' 数 据 库 对 象。 Dim RS As Recordset ' 数 据 结 果 集。
lvw.ListItems.Clear: ' 清 除ListView 的 内 容。 ' ' 定 义ListView 的 列 头 的 名 称。 With lvw.ColumnHeaders .Add," 凭 证 编 号",800 .Add," 凭 证 日 期",1000 .Add," 凭 证 字 号"," 凭 证 类 别"," 首 行 摘 要",1440 .Add," 借 方 金 额 合 计",1000,lvwColumnRight End With
' 产 生 查 询 语 句。 sSQL = "selectvoucher_id,voucher_number,voucher_date,voucher_type_shortname," sSQL=sSQL&"voucher_type_name,voucher_memo,voucher_amountfrom VOUCHER" sSQL = sSQL & "order by voucher_number" ' ' - - - ' 打 开 一 个 数 据 库 结 果 集。 Set wrkJet = CreateWorkspace("NewJetWorkspace","admin","",dbUseJet) Set dbFISCAL = wrkJet.OpenDatabase("FISCAL.mdb") Set RS=. dbFISCAL .Open sSQL,dbOpenForwardOnly ' ' 获 得listview 的 显 示 区 域。 Call GetClientRect(lvw.hwnd,rc)
DoEvents If mbSearchCancel Then ' 中 断 退 出 RS.Close: Set RS = Nothing ' 关 闭、 清 除 结 果 集。 mbSearchCancel = False Screen.MousePointer = vbDefault ' - - ' 刷 新ListView 的 内 容, 显 示 已 经 查 出 的 记 录 数。 Call InvalidateRect(lvw.hwnd,rc,True) Exit Sub End If ' - - - ' 增 加 一 个 显 示 项 目ListItem。 With lvw.ListItems Set itmX = .Add(,"" & RS!voucher_number,"item","item") ' 凭 证 编 号 itmX.SubItems(1) = Format$("" & RS!voucher_date,"yyyy/mm/dd") ' 凭 证 日 期 itmX.SubItems(2) = "" &RS!voucher_type_shortname & "-" — ' 凭 证 字 号 & "" & RS!voucher_number
' 凭 证 类 别 itmX.SubItems(4)=""&RS!voucher_memo ' 首 行 摘 要 itmX.SubItems(5)= Format$("" &RS!voucher_amount,"#,###.00") ' 借 方 合 计 金 额 itmX.Tag = "" & RS!voucher_id End With ' - - ' 避 免 显 示 区 域 的 闪 动 现 象。 Call ValidateRect(lvw.hwnd,rc) RS.MoveNext Loop
'- 刷 新ListView 的 内 容。 显 示 所 有 查 出 的 记 录 数。 Call InvalidateRect(lvw.hwnd,True) ' - ' 关 闭、 清 除 结 果 集。 RS.Close: Set RS = Nothing creen.MousePointer = vbDefault Exit Sub ErrFillListView: Screen.MousePointer = vbDefault MsgBox Err & ":" & Error,vbInformation,Me.Caption Exit Sub End Sub
关 于ListView 本 文 只 是 描 述 了 它 如 何 填 充 大 量 结 果 集 的 方 法, 它 还 有 很多 特 性(property) 和 方 法(method), 利 用 它 们 可 以 达 到 更 完 美 的 显 示 效 果, 有 兴趣 的 读 者 可 以 进 一 步 研 究。 不 管 是 开 发 什 么 样 的 应 用 程 序, 只 有 坚 持 面 向 用 户、方 便 用 户 的 原 则, 这 样 的 软 件 才 具 有 强 大 的 生 命 力。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |