如题:源码
Option ExplicitPrivate recUpdate As Object '  Recordset 对象
Dim WithEvents dgdUpDate As VB.VBControlExtenderConst adVariant = &HC
Const adFldMayBeNull = &H40
Const adFldIsNullable = &H20
Const adFldUpdatable = &H4
Const adStateOpen = 1
Const dbgGridNavigation = &H2Private Sub Form_Load()
    Call InitializeControls         '动态加载所有控件并将其初始化.
End SubPrivate Sub Form_Unload(Cancel As Integer)
    Dim C As Control
    
    For Each C In Controls          '卸载动态添加的控件
       If Not (TypeOf C Is Menu) Then
            Controls.Remove C
            Set C = Nothing
       End If
    Next
    
    Set dgdUpDate = Nothing
    
    If Not (recUpdate Is Nothing) Then
        If recUpdate.State = adStateOpen Then recUpdate.Close
        Set recUpdate = Nothing
    End If
End SubPrivate Sub InitializeControls()       '动态加载所有控件并将其初始化.
    Dim i As Integer
    
    Licenses.Add "MSDataGridLib.DataGrid.1"
    
    Set dgdUpDate = Controls.Add("MSDataGridLib.DataGrid.1", "dgdUpDate")
    
    With dgdUpDate
        .object.Defcolwidth = 1500
        .object.Font.Size = 10
        .object.HeadLines = 2
        .object.RowHeight = 400
        .object.Appearance = 0
        .object.TabAction = dbgGridNavigation
        
        .object.AllowUpdate = True
        .Move 0, 0, 8200, 2180
    
        Set recUpdate = CreateObject("ADODB.Recordset")      '建立假绑定数据源
        For i = 0 To 4  '为Recordset 5个字段,即为 DataGrid 添加 5 列
           recUpdate.Fields.Append "Field" & i, adVariant, , adFldMayBeNull + adFldIsNullable + adFldUpdatable
        Next i
        
        recUpdate.Open
        
        For i = 0 To 3
           recUpdate.AddNew '加4条记录,即为 DataGrid 添加五空行
        Next i
        
        Set .object.DataSource = recUpdate  '绑定 DataGrid 的数据源
        .Visible = True
    End With
End Sub

解决方案 »

  1.   

    上面已是一个可能运行的程序代码,只是有一个不算太大的问题,我不敢相信这么CSDN高手,竟然不能解决这么个问题?嗨!分不够还可以再加.
      

  2.   

    试试:
    右击dataGrid 控件属性-->通用-->允许删除、允许更新的钩去掉
      

  3.   

    加上这么一段Private Sub dgdUpDate_ObjectEvent(Info As EventInfo)
        With Info
            If .Name = "KeyPress" Then
                If .EventParameters(0) = vbKeyEscape Then
                    .EventParameters(0) = 0
                End If
            End If
        End With
    End Sub
      

  4.   

    其实我知将源码中 : .object.AllowUpdate = True  改为:.object.AllowUpdate = False 
    也可以解决上面的问题,但是 DataGrid 将变得不可编辑,这样整个代码失去了意义.
    绿豆老大的办法是可以解决问题, 它是将 ESC 键完全拦截掉了.但我仍想保留下ESC键的一些功能,比如说在一个单元格中输入几个字符的时候,按一下ESC 键, 已经输入的几个字符就被删除了,而我只是不想删除一整行.我现在还没有解决的办法.
      

  5.   

    问题已经解决,我自己找到了更好的解决方法:
    修改后的程序是:Option ExplicitPrivate recUpdate As Object '  Recordset 对象
    Dim WithEvents dgdUpDate As VB.VBControlExtender
     
    Const adLockPessimistic = &H2
    Const adOpenDynamic = 2
    Const adUseClient = 3Const adVariant = &HC
    Const adFldMayBeNull = &H40
    Const adFldIsNullable = &H20
    Const adFldUpdatable = &H4
    Const adStateOpen = 1
    Const dbgGridNavigation = &H2Private Sub Form_Load()
        Call InitializeControls         '动态加载所有控件并将其初始化.
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        Dim C As Control
        
        For Each C In Controls          '卸载动态添加的控件
           If Not (TypeOf C Is Menu) Then
                Controls.Remove C
                Set C = Nothing
           End If
        Next
        
        Set dgdUpDate = Nothing
        
        If Not (recUpdate Is Nothing) Then
            If recUpdate.State = adStateOpen Then recUpdate.Close
            Set recUpdate = Nothing
        End If
    End SubPrivate Sub InitializeControls()       '动态加载所有控件并将其初始化.
        Dim i As Integer
        
        Licenses.Add "MSDataGridLib.DataGrid.1"
        
        Set dgdUpDate = Controls.Add("MSDataGridLib.DataGrid.1", "dgdUpDate")
        
        With dgdUpDate
            .object.Defcolwidth = 1500
            .object.Font.Size = 10
            .object.HeadLines = 2
            .object.RowHeight = 400
            .object.Appearance = 0
            .object.TabAction = dbgGridNavigation
            
            .object.AllowUpdate = True
            .Move 0, 0, 8200, 2180
        
            Set recUpdate = CreateObject("ADODB.Recordset")      '建立假绑定数据源
            For i = 0 To 4  '为Recordset 5个字段,即为 DataGrid 添加 5 列
               recUpdate.Fields.Append "Field" & i, adVariant, , adFldMayBeNull + adFldIsNullable + adFldUpdatable
            Next i
            
            With recUpdate
                .CursorType = adOpenDynamic
                .LockType = adLockPessimistic
                .CursorLocation = adUseClient  '使用客户端游标!
                '以上三句加后面一句 : recUpdate.MoveFirst  解决了反复按压ESC键 DataGrid 会删除未尾一整行的问题!
                .Open
            
            End With
            
            For i = 0 To 3
               recUpdate.AddNew '加4条记录,即为 DataGrid 添加五空行
            Next i
            
            Set .object.DataSource = recUpdate  '绑定 DataGrid 的数据源
            
            recUpdate.MoveFirst
            
            .Visible = True
        End With
    End Sub