在VB中实现PickList功能

news/2024/7/1 0:27:08

在VB中实现PickList功能


前言
使用Delphi编程的人都知道,在Delphi中数据库控件DbGrid具有PickList功能,即编辑所在列时,只要用鼠标点击时,该列所在行便会出现组合框,列出所有内容供用户选择,这很方便数据录入。如图一所示。


图一、Delphi的PickList功能展示图

很令人遗憾,VB所提供的控件Dbgrid32.ocx经作者寻找,无上述的PickList功能。
经作者探索,在VB中仍实现了上述的PickList功能。
思路:
1、在窗体上加入组合框,个数与需实现PickList功能的列数完全相同。
2、在相关事件中,如鼠标或光标(即焦点)定位在PickList列,则显示组合框,其位置、大小与DBGrid的所在单元完全重合,默认下,组合框的值为DBGrid的所在单元的值;否则组合框隐藏。
3、由用户在ComboBox组合框中选择或输入相关信息,并把组合框的信息放入DbGrid单元中即可。
实现过程:
为简单起见,假定需实现PickList的列只有一列,相应的数据库文件已加入相关控件中。
1、新建一工程,在引用中加入Microsoft Data Bound Control(即文件Dbgrid32.ocx);并把控件放入窗体中;设想记录文件包括姓名、退休种类等等,退休种类为第二列(为Dbgrid1的第一列),实现PickList功能;取DbGrid1.RowHeight=300,即与组合框的宽相等,且不允许调整Dbgrid1的行大小。
2、在窗体中加入ComboBox组合框,名称:Cbl退休种类;Visible:False(即隐藏);;在List属性加入信息:如离休|建国前老工人|退休|退职|伤退(注:|代表换行符)。
且把Cbl退休种类放在Dbgrid1上并置前;
实现PickList功能的主要源代码如下:
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 功能的例子。


图二、用VB代码实现DBGrid的列PickList例图

以上代码在VB6.0、Windows98中文版中通过。




http://www.niftyadmin.cn/n/3648609.html

相关文章

如何在Ubuntu 18.04上打包和发布Snap应用程序

The author selected the Electronic Frontier Foundation to receive a donation as part of the Write for DOnations program. 作者选择了电子前沿基金会来接受捐款&#xff0c;这是Write for DOnations计划的一部分。 介绍 (Introduction) One of the largest challenges …

··· Socks Online - 在内部网也能使用QQ ···

Socks Online - 在内部网也能使用QQ(1)互联在线 一、背景现在许多人常用QQ(OICQ)上网聊天&#xff0c;但有时候在办公室或公司内部无法使用。原来的QQ不支持Http Proxy&#xff0c;新的QQ要求会员方能使用&#xff0c;给用户带来许多不便。有没有一个简单的方法在内部网也可以使…

Android网络开启、关闭整理

Android网络开启、关闭整理 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211…

.nsh 怎么样运行_如何在Ubuntu 18.04上使用nsh运行安全的远程命令

.nsh 怎么样运行介绍 (Introduction) It can often be difficult to manage multiple machines on a daily basis. While Secure Shell (SSH) is a good choice for remote access, the protocol itself has some drawbacks in both convenience and security. 每天通常很难管理…

WINAMP SDK 常见问题回答(FAQ)

WINAMP SDK 常见问题回答(FAQ) 这里有一些收集的问题&#xff0c;我们不想每个人重蹈覆辙&#xff0c;希望这里变成知识仓库,能够帮助大家。1、我不知道怎样用sdk&#xff0c;你可以帮助我写一个插件吗&#xff1f;一个好的方法就是去下载sdks&#xff0c;然后去察看或修改代…

EventBus的手写

在上一篇文章我讲了EventBus源码&#xff0c;现在我们来手写一下EventBus 使用 MainActiviity public class MainActivity extends AppCompatActivity {private TextView mTv;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceSta…

node.js 创建服务器_如何使用HTTP模块在Node.js中创建Web服务器

node.js 创建服务器The author selected the COVID-19 Relief Fund to receive a donation as part of the Write for DOnations program. 作者选择了COVID-19救济基金来接受捐赠&#xff0c;这是Write for DOnations计划的一部分。 介绍 (Introduction) When you view a webp…

WINAMP 配置文件

WINAMP 配置文件很简单&#xff0c;就没有翻译了 &#xff1b;-&#xff09;Configuration Files Any skin file is not complete without first finishing up the configuration files. These configuration files control such things as the background and foreground colo…