有这样一篇文章:
开发者们已经总结了在表格控件(grid control)中改变数据显示方式以及添加新的数据行的各种方法。这些方法包括分割特定的数据输入窗口以及显示文本框(这样输入后的数据可以修改)。在本文中,我们将介绍一种简单的方法,用这种方法我们可以直接在表格控件中输入和修改数据。我们在例子中用到了常见的Microsoft Flex Grid Control。
让我们开始编写代码
首先,按照下面的步骤创建一个简单的VB项目:
1. 进入VB开发环境并开始一个新的项目。 
2. 在Project Components中找到Microsoft FlexGrid Control 6.0。 
3. 向你的表单(form)中添加一个MS FlexGrid控件,它的名字为grdInfo。现在你的屏幕应该如图A所示。 
4. 在Form Load事件中加入如下代码: 
CallSetGridProperties
Call FillData 
5. 把清单A中的代码加到grdInfo_KeyPress(KeyAscii As Integer) 事件中。 
Select Case KeyAscii
  Case 65 To 90, 97 To 122, 48 To 57 'valid characters(letters & numbers only)
   grdInfo.Text = grdInfo.Text & Chr(KeyAscii)
  Case 8        'backspace
   If Len(grdInfo.Text) > 0 Then
    grdInfo.Text = Left(grdInfo.Text, (Len(grdInfo.Text) - 1))
   End If
  Case Else       'invalid characters
   KeyAscii = 0
   Beep
 End Select
6. 用清单B中的代码添加Private Sub SetGridProperties()。 
With grdInfo
  .Cols = 4
  .Rows = 1
  .FocusRect = flexFocusHeavy
  .SelectionMode = flexSelectionFree
  .ColWidth(0) = 200
  .ColWidth(1) = 1350
  .ColWidth(2) = 1400
  .ColWidth(3) = 1000
   .Row = 0
  .Col = 1
  .Text = "First Name"
  
  .Col = 2
  .Text = "Last Name"
   .Col = 3
  .Text = "Middle Initial"
 End With
 7用清单C中的代码田间Private Sub FillData()。 
'add data
 With grdInfo
  .AddItem "1" & vbTab & "Michael" & vbTab & "Foster" & vbTab & "M"
  .AddItem "2" & vbTab & "Angela" & vbTab & "Johnson" & vbTab & "K"
  .AddItem "3" & vbTab & "Alex" & vbTab & "Smith" & vbTab & "H"
 End With
  'move to first cell
 With grdInfo
  .Col = 1
  .Row = 1
 End With
7. 按[Ctrl][F5]来运行该项目,你看到的屏幕应该如图B所示。 
图A
 
图B
 
现在,点击表格第一行的第一个单元,按几次退格键来清楚单元中已有的字符,然后任意填写。如你所见,你可以修改单元格中的内容。
它是如何工作的?
在FormLoad事件中,我们调用了两个subs:SetGridProperties以及FillData。SetGridProperties设置表格控件的属性,指定表格的行数和栏(列)数,并设置栏目标题和选择状态。在FillData中,我们向表格添加数据并把选择的焦点置于第一行的第一个数据栏中。
在grdInfo_KeyPress事件中,所有的动作均可发生。当用户开始向表格输入时,该事件被调用。KeyAscii是用户敲入的字符。我们检查用户按下了哪些键,基于键值决定进行哪些动作。我们用一个Select Case来判定需要执行什么动作。
KeyAscii在65到90、97到122、以及48到57的码值分别代表小写字母(a到z)、大写字符(A到Z)以及数字(1到9)。如果用户按下的键是上面三种情况中的某一种,那么就把它加到选定状态的表格单元中。我们利用表格的Text属性来做到这一点,表格的Text属性把适当的字符加到处于选定状态的单元并返回中其中的文本。
KeyAscii码8代表一个退格符。如果用户按下退格键,那么我们应该删掉处于选定状态的单元格的一个字符。这个功能依然是用表格的Text属性来实现的。过程如下:首先,我们把Text属性设定为其初值(单元格包含的文本);然后,我们用Left函数来返回文本中的字符串,删去字符串末尾的那个字符。
你可以在这儿下载完整的代码。
Option Explicit
 Private Sub SetGridProperties()
  With grdInfo
  .Cols = 4
  .Rows = 1
  .FocusRect = flexFocusHeavy
  .SelectionMode = flexSelectionFree
   .ColWidth(0) = 200
  .ColWidth(1) = 1350
  .ColWidth(2) = 1400
  .ColWidth(3) = 1000
  .Row = 0
  .Col = 1
  .Text = "First Name"
  .Col = 2
  .Text = "Last Name"
  .Col = 3
  .Text = "Middle Initial"
 End With
 End Sub
 Private Sub FillData()
 'add data
 With grdInfo
  .AddItem "1" & vbTab & "Michael" & vbTab & "Foster" & vbTab & "M"
  .AddItem "2" & vbTab & "Angela" & vbTab & "Johnson" & vbTab & "K"
  .AddItem "3" & vbTab & "Alex" & vbTab & "Smith" & vbTab & "H"
 End With
 'move to first cell
 With grdInfo
  .Col = 1
  .Row = 1
 End With
 End Sub
 Private Sub Form_Load()
 Call SetGridProperties
 Call FillData
 End Sub
 Private Sub grdInfo_KeyPress(KeyAscii As Integer)
 Select Case KeyAscii
  Case 65 To 90, 97 To 122, 48 To 57 'valid characters(letters & numbers only)
   grdInfo.Text = grdInfo.Text & Chr(KeyAscii)
  Case 8        'backspace
   If Len(grdInfo.Text) > 0 Then
    grdInfo.Text = Left(grdInfo.Text, (Len(grdInfo.Text) - 1))
   End If
  Case Else       'invalid characters
   KeyAscii = 0
   Beep
 End Select
 End Sub可是不能解决回车移动到相邻的列或行,不能输入小数和汉字,不能把其中输入的多行数据写入相应的数据库字段,请帮我解决以上问题!!!
先谢!!!!

解决方案 »

  1.   

    '在窗体上放一文本框text1,和一MSHFLEXGRID控件
    Dim adoCnn As New ADODB.Connection
    Dim adoCmm As New ADODB.Command
    Dim Rs As New ADODB.Recordset
    Private Sub Command1_Click()
    Set MSHFlexGrid1.DataSource = Nothing
    MSHFlexGrid1.Clear
    MSHFlexGrid1.ClearStructure
    MSHFlexGrid1.Cols = 2
    MSHFlexGrid1.Rows = 2
    MSHFlexGrid1.Refresh
    'Unload MSHFlexGrid1
    Call Toolbar1_ButtonClick(Toolbar1.Buttons(1))
    End SubPrivate Sub Form_Load()
        'Toolbar1.Buttons(1).Image = 1
       Text1.Move -10000, -10000, 1, 1
        adoCnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Program Files\Microsoft Visual Studio\VB98\NWIND.MDB;Persist Security Info=False"
        Rs.CursorLocation = adUseClient
        Rs.Open "select * from employees", adoCnn, adOpenDynamic, adLockBatchOptimistic
        Set MSHFlexGrid1.DataSource = Rs
    End SubPrivate Sub MSHFlexGrid1_EnterCell()
        MSHFlexGrid1.CellBackColor = vbBlue
        MSHFlexGrid1.CellForeColor = vbWhite
        Text1.Text = MSHFlexGrid1.Text
        Text1.SelStart = 0
        Text1.SelLength = Len(Text1.Text)
    End SubPrivate Sub MSHFlexGrid1_LeaveCell()
        MSHFlexGrid1.CellBackColor = vbWhite
        MSHFlexGrid1.CellForeColor = vbBlue
    End SubPrivate Sub MSHFlexGrid1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
        Text1.SetFocus
    End SubPrivate Sub Text1_Change()
        MSHFlexGrid1.Text = Text1.Text
    End SubPrivate Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
        Select Case KeyCode
            Case vbKeyLeft, vbKeyRight, vbKeyUp, vbKeyDown
                KeyCode = 0
        End Select
    End Sub
      

  2.   

    '在窗体上放一文本框text1,和一MSHFLEXGRID控件
    Dim adoCnn As New ADODB.Connection
    Dim adoCmm As New ADODB.Command
    Dim Rs As New ADODB.Recordset
    Private Sub Form_Load()
        'Toolbar1.Buttons(1).Image = 1
       Text1.Move -10000, -10000, 1, 1
        adoCnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Program Files\Microsoft Visual Studio\VB98\NWIND.MDB;Persist Security Info=False"
        Rs.CursorLocation = adUseClient
        Rs.Open "select * from employees", adoCnn, adOpenDynamic, adLockBatchOptimistic
        Set MSHFlexGrid1.DataSource = Rs
    End SubPrivate Sub MSHFlexGrid1_EnterCell()
        MSHFlexGrid1.CellBackColor = vbBlue
        MSHFlexGrid1.CellForeColor = vbWhite
        Text1.Text = MSHFlexGrid1.Text
        Text1.SelStart = 0
        Text1.SelLength = Len(Text1.Text)
    End SubPrivate Sub MSHFlexGrid1_LeaveCell()
        MSHFlexGrid1.CellBackColor = vbWhite
        MSHFlexGrid1.CellForeColor = vbBlue
    End SubPrivate Sub MSHFlexGrid1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
        Text1.SetFocus
    End SubPrivate Sub Text1_Change()
        MSHFlexGrid1.Text = Text1.Text
    End SubPrivate Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
        Select Case KeyCode
            Case vbKeyLeft, vbKeyRight, vbKeyUp, vbKeyDown
                KeyCode = 0
        End Select
    End Sub