[开源]MSHFlexGrid程序运行时怎样对单元格进行编辑输入
现用的方法是在控件上面加了个TEXT控件.将他的值复制到MS中.但是当程序运行在单元格输入时TEXT的位置与底部格老有偏差.下面是原代码:希望高手指点下.
'*********************编辑使MSHFlexGrid控件可以进行输入
Private Function fgi(ByVal r As Integer, ByVal c As Integer)
As Integer
fgi = c + MSHFlexGrid1.Cols * r
End Function
Private Sub MSHFlexGrid1_Click()
fgedit MSHFlexGrid1, TxtEdit, 32
End Sub
Private Sub MSHFlexGrid1_GotFocus()
'MSHFlexGrid1获得焦点
If TxtEdit.Visible = False Then
Exit Sub
End If
'复制数据隐藏文本框
MSHFlexGrid1 = TxtEdit
TxtEdit.Visible = False
End Sub
Private Sub MSHFlexGrid1_KeyPress(KeyAscii As Integer)
'处理MSHFlexGrid1接收按键,进行单元格编辑
fgedit MSHFlexGrid1, TxtEdit, KeyAscii
End Sub
Private Sub fgedit(fg As Control, Edt As Control, KeyAscii As
Integer)
Select Case KeyAscii
'根据输入的字符进行相应操作
Case 0 To 32
'空格表示编辑当前文本
Edt = fg
Edt.SelStart = 0
Case Else
' 其他字符代替单元格的文本
Edt = Chr(KeyAscii)
Edt.SelStart = 0
End Select
'定位文本框到对应的单元格位置
Dim X As Integer, Y As Integer
X = 1070 '横向微调
Y = 10 '纵向微调
Edt.Move MSHFlexGrid1.CellLeft + X, MSHFlexGrid1.CellTop - Y,
MSHFlexGrid1.CellWidth, MSHFlexGrid1.CellHeight
Edt.Visible = True
Edt.SetFocus
End Sub
Private Sub MSHFlexGrid1_LeaveCell()
'离开MSHFlexGrid1当前单元个前
If TxtEdit.Visible = False Then
Exit Sub
End If
'复制数据并隐藏文本框
MSHFlexGrid1 = TxtEdit
TxtEdit.Visible = False
End Sub
Private Sub TxtEdit_KeyDown(KeyCode As Integer, Shift As
Integer)
editkeycode MSHFlexGrid1, TxtEdit, KeyCode, Shift
End Sub
Private Sub TxtEdit_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
KeyAscii = 0
End If
End Sub
'处理文本框接受字符
Private Sub editkeycode(fg As Control, Edt As Control,
KeyAscii As Integer, Shift As Integer)
Select Case KeyAscii
Case 27
'ESC:隐藏文本框,返回MSHFlexGrid1
Edt.Visible = False
MSHFlexGrid1.SetFocus
Case 13
'返回MSHFlexGrid1
MSHFlexGrid1.SetFocus
Case 38
'向上
MSHFlexGrid1.SetFocus
DoEvents
If MSHFlexGrid1.Row > MSHFlexGrid1.FixedRows Then
MSHFlexGrid1.Row = MSHFlexGrid1.Row - 1
End If
Case 40
'向下
MSHFlexGrid1.SetFocus
DoEvents
If MSHFlexGrid1.Row < MSHFlexGrid1.Rows - 1 Then
MSHFlexGrid1.Row = MSHFlexGrid1.Row + 1
End If
End Select
End Sub
__________________________________________________________________________________
Private Sub MSFlexGrid1_KeyDown(KeyCode As Integer, Shift As
Integer)
SelectFlag = 1 ‘//窗体上有3 个MSHFlexGrid, 判断选择哪一个MSHFlexGrid
If KeyCode = vbKeyReturn And Not Text1.Visible Then
With MSFlexGrid1
If .ColSel = 1 Then
Call toEditGrid(.Col, .Row)
End If
End With
End If
End Sub
Private Sub Text1_Change()
Select Case SelectFlag
Case 1
MSFlexGrid1.Text = Text1.Text
Case 2
MSFlexGrid2.Text = Text1.Text
Case 3
MSFlexGrid3.Text = Text1.Text
End Select
End Sub
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As
Integer)
If KeyCode = vbKeyUp Then
Text1.Visible = False
Select Case SelectFlag
Case 1
MSFlexGrid1.SetFocus
Case 2
MSFlexGrid2.SetFocus
Case 3
MSFlexGrid3.SetFocus
End Select
SendKeys "{up}"
Else
If KeyCode = vbKeyDown Then
Text1.Visible = False
Select Case SelectFlag
Case 1
MSFlexGrid1.SetFocus
Case 2
MSFlexGrid2.SetFocus
Case 3
MSFlexGrid3.SetFocus
End Select
SendKeys "{down}"
End If
End If
End Sub
Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii = vbKeyReturn Then
KeyAscii = 0
Text1.Visible = False
Select Case SelectFlag
Case 1
MSFlexGrid1.SetFocus
Case 2
MSFlexGrid2.SetFocus
Case 3
MSFlexGrid3.SetFocus
End Select
End If
If KeyAscii = vbKeyEscape Then
KeyAscii = 0
Select Case SelectFlag
Case 1
MSFlexGrid1.Text = OldText
Text1.Visible = False
MSFlexGrid1.SetFocus
Case 2
MSFlexGrid2.Text = OldText
Text1.Visible = False
MSFlexGrid2.SetFocus
Case 3
MSFlexGrid3.Text = OldText
Text1.Visible = False
MSFlexGrid3.SetFocus
End Select
End If
End Sub
Private Sub Text1_LostFocus()
Text1.Visible = False
End Sub
Private Sub toEditGrid(ByVal C As Integer, ByVal R As
Integer)
Select Case SelectFlag
Case 1
With MSFlexGrid1
.Col = C: .Row = R
Text1.Left = .Left + .ColPos(C)
Text1.Top = .Top + .RowPos(R)
If .Appearance = flex3D Then
Text1.Left = Text1.Left + 2 * Screen.TwipsPerPixelX
Text1.Top = Text1.Top + 2 * Screen.TwipsPerPixelY
End If
Text1.Width = .ColWidth(C)
Text1.Height = .RowHeight(R)
Text1.Text = .Text
OldText = .Text
End With
Case 2
With MSFlexGrid2
.Col = C: .Row = R
Text1.Left = .Left + .ColPos(C)
Text1.Top = .Top + .RowPos(R)
If .Appearance = flex3D Then
Text1.Left = Text1.Left + 2 * Screen.TwipsPerPixelX
Text1.Top = Text1.Top + 2 * Screen.TwipsPerPixelY
End If
Text1.Width = .ColWidth(C)
Text1.Height = .RowHeight(R)
Text1.Text = .Text
OldText = .Text
End With
Case 3
With MSFlexGrid3
.Col = C: .Row = R
Text1.Left = .Left + .ColPos(C)
Text1.Top = .Top + .RowPos(R)
If .Appearance = flex3D Then
Text1.Left = Text1.Left + 2 * Screen.TwipsPerPixelX
Text1.Top = Text1.Top + 2 * Screen.TwipsPerPixelY
End If
Text1.Width = .ColWidth(C)
Text1.Height = .RowHeight(R)
Text1.Text = .Text
OldText = .Text
End With
End Select
Text1.Visible = True
Text1.SelStart = Len(Text1.Text)
Text1.SetFocus
End Sub
接录至:http://bbs.bccn.net/thread-184170-1-1.html
自己结合网上前辈的经验,写的一个(基本功能已测试)
Private Sub Form_Load()
'初始化MSHFlexGrid1控件
With MSHFlexGrid1
.Cols =
5
.Rows =
5
'定位到第一格
.Col =
1
.Row =
1
End With
'Text1隐藏起来
Text1.Visible = False
End Sub
Private Sub MSHFlexGrid1_DblClick()
'移动Text1到表格位位置上,赋值到文本框
With MSHFlexGrid1
Text1.Visible = True
Text1.Left =
.Left + .CellLeft
Text1.Top =
.Top + .CellTop
Text1.Width
= .CellWidth
Text1.Height
= .CellHeight
Text1.Text =
.Text
Text1.SetFocus
Text1.SelStart = 0
Text1.SelLength = Len(Text1.Text)
End With
End Sub
Private Sub MSHFlexGrid1_KeyDown(KeyCode As Integer, Shift As
Integer)
If KeyCode = vbKeyReturn
Then
Text1.Visible = True
Text1.SetFocus
Text1.SelStart = 0
Text1.SelLength = Len(Text1.Text)
End If
End Sub
Private Sub MSHFlexGrid1_KeyPress(KeyAscii As Integer)
'移动文本框并选择文本内容
With MSHFlexGrid1
Text1.Visible = True
Text1.Left =
.Left + .CellLeft
Text1.Top =
.Top + .CellTop
Text1.Width
= .CellWidth
Text1.Height
= .CellHeight
Text1.Text =
.Text
Text1.SetFocus
Text1.SelStart = 0
Text1.SelLength = Len(Text1.Text)
End With
End Sub
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As
Integer)
'按回车键
If KeyCode = vbKeyReturn Then
'没有移动到未列,就直接移一列
If MSHFlexGrid1.Col < MSHFlexGrid1.Cols - 1 Then
MSHFlexGrid1.Text = Text1.Text
Text1.Visible = False
MSHFlexGrid1.Col = MSHFlexGrid1.Col + 1
Text1.Text = MSHFlexGrid1.Text
'最后列,就跳下下一行
ElseIf MSHFlexGrid1.Col = MSHFlexGrid1.Cols - 1 Then
MSHFlexGrid1.Text = Text1.Text
Text1.Visible = False
If MSHFlexGrid1.Row < MSHFlexGrid1.Rows - 1 Then
'移动到下一行第一列
MSHFlexGrid1.Row = MSHFlexGrid1.Row + 1
MSHFlexGrid1.Col = 1
Text1.Text = MSHFlexGrid1.Text
'如果移动到最后一行就跳回第一行第一列
ElseIf MSHFlexGrid1.Row = MSHFlexGrid1.Rows - 1 Then
MSHFlexGrid1.Row = 1