转发一帖子: 思路: 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 SubSub 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
可以在Dbgrid1的keypress事件中控制键盘 if Dbgrid1.selectedfield=Dbgrid1.datasource.dataset.fieldbyname('字段名') then begin if not (key in [#13] then //回车键可以保留,其它屏蔽 key:=#0; end; //可能还要在keydown中控制delete键
MaximStr := '宠辱不惊,看庭前花开花落,去留无意;
毁誉由人,望天上云卷云舒,聚散任风。';
if Not Assigned(I) then
I := TI.Create(Nil);
I.Maxim := MaximStr;
I.Explain := '假如上述代码中出现“OA”等字样,删除它们';
I.Desire := '加不加分随你';
—————————————————————————————————
也最简单
配上内存表很方便
它会自动产生下拉框的
你试试就知了
思路: 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 SubSub 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
if Dbgrid1.selectedfield=Dbgrid1.datasource.dataset.fieldbyname('字段名') then
begin
if not (key in [#13] then //回车键可以保留,其它屏蔽
key:=#0;
end;
//可能还要在keydown中控制delete键