当前位置:编程学习 > VB >>

datagrid的问题,请高手帮帮忙


在我的程序中要对datagrid进行编辑,如图中,第一列和第四列是在新加一行时,写入到SQL表中,第三列需要按快捷码查询,结果放到listview中再进行选择,然后写到将名称写到第三列中。运行过程中,有一个“新建”按钮,第一行是在新建中加的序号和录入者,没有问题,当在第二行输入快捷码后,回车,则类似死循环一样的问题,看一下设备管理器,已经为“无响应”。
“新建”按钮代码
CR = "INSERT INTO HT_khxxls(KHXX003,CREATOR) select '0001','" & LoadPeople & "'"
    ADOCN.Execute CR
    Adodc2.RecordSource = "SELECT * FROM HT_khxxls WHERE CREATOR='" & LoadPeople & "' order by KHXX003"
    Set DataGrid2.DataSource = Adodc2
    Adodc2.Refresh
    DataGrid2.Refresh
    DataGrid2.Enabled = True
    DataGrid2.AllowAddNew = True
    DataGrid2.AllowDelete = True
    DataGrid2.AllowUpdate = True
datagrid中的代码
事件AfterColEdit
Private Sub DataGrid2_AfterColEdit(ByVal ColIndex As Integer)
    If DataGrid2.Col = 2 Then 'Exit Sub '第三列(信息内容)结束向三列写入发票名头、发货到站信息
        Dim ConStr As String
        Dim adodc As New ADODB.Connection
        Dim rs1 As ADODB.Recordset
        Dim rs2 As ADODB.Recordset
        Set rs1 = New ADODB.Recordset
        Set rs2 = New ADODB.Recordset
        Dim Item As ListItem
        '如果列三列为空,刚不显示list列表
        If DataGrid2.Columns(2).Text = "" Then
            List2.ListItems.Clear
            List2.Visible = False
            Exit Sub
        End If
        '按快捷码到表中模糊查询
        sql1 = "SELECT MA001,MA003,MA102 FROM COPMA WHERE MA102 like '" & Trim(DataGrid2.Columns(2).Text) & "%' or MA001 like '" & Trim(DataGrid2.Columns(2).Text) & "%'"   '根据快捷码查询
 '单步运行时在下面这一句出现问题,可以查询分析器中运行没有问题呢!!!
        rs1.Open sql1, ADOCN, adOpenKeyset, adLockOptimistic
        If rs1.RecordCount = 1 Then     '快捷码查询结果唯一时,直接将结果写入datagrid中
            rs1.MoveFirst
            DataGrid2.Columns(2).Text = rs1("MA003")
            List2.Visible = False
        ElseIf rs1.RecordCount > 1 Then   '快捷码查到多个信息,将结果写到list列表中供选择
            rs1.MoveFirst
            List2.Sorted = False
            List2.ListItems.Clear
            Do While Not rs1.EOF 'And i < rs1.PageSize
                Set Item = List2.ListItems.Add(, , , , 1)
                With Item
                    .SubItems(1) = IIf(IsNull(rs1("MA001")), "", Trim(rs1("MA001")))
                    .SubItems(2) = IIf(IsNull(rs1("MA003")), "", Trim(rs1("MA003")))
                    .SubItems(3) = IIf(IsNull(rs1("MA102")), "", Trim(rs1("MA102")))
                End With
                rs1.MoveNext
            Loop
            ’指定list显示的位置并令其可见
            List2.Left = 9960
            List2.Top = 3250 + DataGrid2.RowTop(DataGrid2.Row) + DataGrid2.RowHeight
            List2.Visible = True
        End If
        rs1.Close
    End If
End Sub
如果将上面事件都注释掉则在下面的事件中出现问题
Private Sub DataGrid2_AfterInsert()
    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset
    sql = "SELECT max(KHXX003) AS MAXXH2 FROM HT_khxxls WHERE CREATOR='" & LoadPeople & "'"
    rs.Open sql, ADOCN, adOpenKeyset, adLockOptimistic
    If rs.RecordCount > 0 Then
        XH = rs("MAXXH2") + 1
    Else
        XH = "0001"
    End If
下面被注释的这几行,在正常按顺序录入时没有问题,一但记录数超过8行(8是当前控件显示的行数),将滚动条往回拉,或在修改时,再增加记录时,则提示DataGrid2.Row = 8这一行出错“行号无效"
'    If Adodc2.Recordset.RecordCount > 1 And Adodc2.Recordset.RecordCount < 10 Then
'        DataGrid2.Row = Adodc2.Recordset.RecordCount - 1
'    Else
'        DataGrid2.Row = 8
'    End If
'    DataGrid2.Columns(3).Text = LoadPeople
'    DataGrid2.Columns(0).Text = Format(XH, "0000") 'DataGrid2.Count
'    DataGrid2.Refresh
由于上面注释部分有问题,又想的下面这个办法,先在SQL中插入记录,再刷新datagrid,结果出现死机的状态,按步跟踪也踪不到
    CR = "INSERT INTO HT_khxxls(KHXX003,CREATOR) select '" & Format(XH, "0000") & "','" & LoadPeople & "'"
    ADOCN.Execute CR
    Adodc2.RecordSource = "SELECT * FROM HT_khxxls WHERE CREATOR='" & LoadPeople & "' order by KHXX003"
    Set DataGrid2.DataSource = Adodc2
    Adodc2.Refresh
    DataGrid2.Refresh
End Sub
下面是datagrid的其它事件,但和第三列都没什么关系
Private Sub DataGrid2_BeforeColUpdate(ByVal ColIndex As Integer, OldValue As Variant, Cancel As Integer)
    If xChangeItem = "xg" Then
        If DataGrid2.Col = 2 Then
            Label11 = OldValue
        End If
    End If
End Sub

Private Sub DataGrid2_BeforeDelete(Cancel As Integer)
    Dim mResult As Integer
    If Cancel = False Then str = DataGrid2.Columns(0).Text
        mResult = MsgBox("确定删除该记录吗?", vbQuestion + vbYesNo, "提示信息")
        If mResult = vbNo Then
            Cancel = True
    End If
End Sub

Private Sub DataGrid2_ButtonClick(ByVal ColIndex As Integer)
    If Not List.Visible Then
        List.Visible = True
        List.Width = DataGrid2.Columns(1).Width
'        List.Height = 780
        List.Left = DataGrid2.Left + DataGrid2.Columns(1).Left
        List.Top = DataGrid2.Top + DataGrid2.RowTop(DataGrid2.Row) + DataGrid2.RowHeight
        '.RowTop返回一个包含datagrid控件的一个指定行顶部的纵坐标。
    End If
End Sub


Private Sub DataGrid2_Click()
List1.Visible = False
List2.Visible = False
List3.Visible = False
MonthView1.Visible = False

End Sub

Private Sub DataGrid2_Error(ByVal DataError As Integer, Response As Integer)
Response = 0
End Sub

Private Sub DataGrid2_RowColChange(LastRow As Variant, ByVal LastCol As Integer)
    List.Visible = False
End Sub

自己解决了,原来很简单,只要让adodc指到最后一条就可以了 呵呵,有时候就那么简单,头脑一醒问题也就解决了。 datagrid,n年没用了。
补充:VB ,  控件
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,