1、新建一工程,在引用中加入Microsoft
Data Bound
Control(即文件Dbgrid32.ocx);并把控件放入窗体中;设想记录文件包括姓名、退休种类等等,退休种类为第二列(为Dbgrid1的第一列),实现PickList功能;取DbGrid1.RowHeight=300,即与组合框的宽相等,且不允许调整Dbgrid1的行大小。
Option Explicit Dim LastRecNum As Integer
'记录组合框内容改变时记录的位置 Private Sub cbl退休种类显示_LostFocus() '更新记录值 Dim
CurRecNum '当前记录号 With Data1.Recordset CurRecNum =
.AbsolutePosition + 1 .MoveFirst .Move LastRecNum -
1 .Edit .Fields(1) =
frmPick.cbl'退休种类显示 .Update '记录位置还原 .Move CurRecNum -
LastRecNum End With End Sub
'关注以下三个事件
Private Sub DBGrid1_RowColChange(LastRow As Variant, ByVal
LastCol As Integer) DisPlayComboBox End Sub Private Sub
DBGrid1_ColResize(ByVal ColIndex As Integer, Cancel As
Integer) DisPlayComboBox End Sub Private Sub
DBGrid1_Scroll(Cancel As Integer) Cancel =
False '组合框消失 DoEvents frmPick.cbl退休种类显示.Visible = False End
Sub
Sub
DisPlayComboBox() '符合条件时对组合框等应做的操作。为过程为文章的关键所在。 '当前记录所在位置 LastRecNum
= Data1.Recordset.AbsolutePosition + 1 'frmPick.Caption =
Data1.Recordset.Fields(1).Value With
frmPick.cbl退休种类显示 '当光标或鼠标位于"退休种类"列时, If DBGrid1.Col = 1
Then '组合框出现且拥有焦点; .Visible = True .SetFocus If
DBGrid1.Columns(1) = "" Then .Text =
.List(0) Else .Text = DBGrid1.Columns(1) End
If 'cbl退休种类显示出现的位置 '左: Dim RecordTitleWidth
'记录头的宽度 RecordTitleWidth = 280 '该值不知怎获取,本处系逐步调整; .Left =
RecordTitleWidth + DBGrid1.Left + GetLeftColPos Dim ColHeadHeight
'列头的高度 ColHeadHeight = 220 '该值仍不知怎获取,本处系逐步调整; .Top =
DBGrid1.Top + DBGrid1.Row * DBGrid1.RowHeight +
ColHeadHeight .Width = DBGrid1.Columns(1).Width End
If '当光标不在PickList 列时 If DBGrid1.Col <> 1
Then .Visible = False End If End With End
Sub
Function
GetLeftColPos() 'DBgrid1控件中最左边可见列距实现PickList列的位置 Dim i i =
DBGrid1.LeftCol GetLeftColPos = 0 If i < 1 Then Do
While i < 1 '该处1的列系实现PickList的列 GetLeftColPos = GetLeftColPos +
DBGrid1.Columns(i).Width i = i + 1 Loop End If If i
> 1 Then Do While i > 1 '该处1的列系实现PickList的列 GetLeftColPos
= GetLeftColPos - DBGrid1.Columns(i).Width i = i -
1 Loop End If End
Function 图二为用VB代码编写的PickList 功能的例子。