一个窗口A ,里面有一个ListView, 启动的时候,从某数据库读出数据并显示这个时候,单击A里面的一个Button,启动另外一个窗口, 输入数据,然后将数据写入数据库,然后调用A里面的显示程序,更新ListView,但是ListView 不会马上被更新。 不知道为什么。 我用了两种方法,一种调用form A 的函数, 更新控件内容,另一种调用公共模块的函数,更新。 结果都不行。不知道是什么问题。麻烦帮我解决以下,马上给分。另外,我的程序已经打好包,如果帮我研究的话,留下email地址,我给发过去,谢谢了程序列在下面
form1 Public connectionstrings As String
Dim cn As New ADODB.ConnectionPrivate Sub Command1_Click()
    Form2.Show
End SubPrivate Sub Form_Load()
    ListView1.View = lvwReport
    connectionstrings = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\works\datarefresh\data.mdb"
    cn.ConnectionString = connectionstrings
    cn.CursorLocation = adUseClient
    cn.Open
    loadData
End Sub
Public Sub loadData()    ListView1.ListItems.Clear
    
    Dim rs As New ADODB.Recordset
    rs.Open "select * from student order by id", cn, adOpenDynamic, adLockOptimistic
    
    Dim i As Long
    
    Dim itmx As ListItem
    i = 0
    
    Do While Not rs.EOF
        Set itmx = ListView1.ListItems.Add(, "G" & CStr(i), CStr(rs.Fields(0)))
        itmx.SubItems(1) = rs.Fields(1)
        i = i + 1
        rs.MoveNext
    Loop
    
    rs.Close
    Set rs = Nothing
    
End SubPrivate Sub Form_Unload(Cancel As Integer)
    cn.Close
    Set cn = Nothing
End Sub
//form2  Dim cn As New ADODB.ConnectionPrivate Sub Command1_Click()
    Dim id As String
    Dim name As String
    id = Text1.Text
    name = Text2.Text
    cn.Execute "insert into student values('" & id & "','" & name & "')"
    
    'call the function of form1, 更新数据
    Form1.loadData
    Unload Me
End SubPrivate Sub Command2_Click()
    Dim id As String
    Dim name As String
    id = Text1.Text
    name = Text2.Text
    cn.Execute "insert into student values('" & id & "','" & name & "')"
    
    '调用公共模块的函数,更新数据
    Call load(Form1.ListView1) 
    Unload MeEnd SubPrivate Sub Form_Load()
    cn.ConnectionString = Form1.connectionstrings
    cn.CursorLocation = adUseClient
    cn.Open
    
End SubPrivate Sub Form_Unload(Cancel As Integer)
    cn.Close
    Set cn = Nothing
End Sub//公共模块Public fMainForm As Form1Sub main()
    Set fMainForm = New Form1
    fMainForm.Show
    
End SubPublic Sub load(ListView1 As ListView)
    
    Dim cn As New ADODB.Connection
    cn.ConnectionString = Form1.connectionstrings
    cn.CursorLocation = adUseClient
    cn.Open
    
    Dim rs As New ADODB.Recordset
    rs.Open "select * from student order by id", cn, adOpenDynamic, adLockOptimistic
    
    ListView1.ListItems.Clear
    Dim i As Long
    Dim itmx As ListItem
    i = 0
    
    Do While Not rs.EOF
        Set itmx = ListView1.ListItems.Add(, "G" & CStr(i), CStr(rs.Fields(0)))
        itmx.SubItems(1) = rs.Fields(1)
        i = i + 1
        rs.MoveNext
    Loop
    
    rs.Close
    Set rs = Nothing
    
    cn.Close
    Set cn = Nothing
    
End Sub

解决方案 »

  1.   

    对了,加一句,这个不是控件的问题,我用了MSHFlexGrid也是一样的,现在改用ListView也不行,不知道为什么。
      

  2.   

    感觉上象是因为参数传递方式造成的问题,应该用传地址的方式,而VB默认是传值。
    也就是说,公共函数load中对ListView1的操作都没有写入Form1.ListView1中。
      

  3.   

    这是由于你定义了多个数据库连接造成的,这样你在第二次打开数据时更改了数据,而第一次打开的数据连接没有重新连接,生成数据读取时发生错误,现改为定义一个数据库连接(在模块中定义)
    改成如下就OK了,建议多看一下基础知识:
    Form1:
    Dim connectionstrings As String
    Private Sub Command1_Click()
        Form2.Show
    End SubPrivate Sub Form_Load()
        ListView1.View = lvwReport
        connectionstrings = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\data.mdb"
        cn.ConnectionString = connectionstrings
        'cn.CursorLocation = adUseClient
        cn.Open
        loadData
    End Sub
    Public Sub loadData()    ListView1.ListItems.Clear
        
        Dim rs As New ADODB.Recordset
        rs.Open "select * from student order by id", cn, adOpenDynamic, adLockOptimistic
        
        Dim i As Long
        
        Dim itmx As ListItem
        i = 0
        
        Do While Not rs.EOF
            Set itmx = ListView1.ListItems.Add(, "G" & CStr(i), CStr(rs.Fields(0)))
            itmx.SubItems(1) = rs.Fields(1)
            i = i + 1
            rs.MoveNext
        Loop
        ListView1.Refresh
        rs.Close
        Set rs = Nothing
        
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        cn.Close
        Set cn = Nothing
    End SubForm2:Private Sub Command1_Click()
        Dim id As String
        Dim name As String
        id = Text1.Text
        name = Text2.Text
        cn.Execute "insert into student values('" & id & "','" & name & "')"
        
        'call the function of form1, 更新数据
        Form1.loadData
        Unload Me
    End SubPrivate Sub Command2_Click()
        Dim id As String
        Dim name As String
        id = Text1.Text
        name = Text2.Text
        cn.Execute "insert into student values('" & id & "','" & name & "')"
        
        '调用公共模块的函数,更新数据
        Call load(Form1.ListView1)
        Unload MeEnd Sub'模块代码:
    Public fMainForm As Form1
    Public cn As New ADODB.ConnectionSub main()
        Set fMainForm = New Form1
        fMainForm.Show
        
    End SubPublic Sub load(ListView1 As ListView)
        
        Dim rs As New ADODB.Recordset
        rs.Open "select * from student order by id", cn, adOpenDynamic, adLockOptimistic
        
        ListView1.ListItems.Clear
        Dim i As Long
        Dim itmx As ListItem
        i = 0
        
        Do While Not rs.EOF
            Set itmx = ListView1.ListItems.Add(, "G" & CStr(i), CStr(rs.Fields(0)))
            itmx.SubItems(1) = rs.Fields(1)
            i = i + 1
            rs.MoveNext
        Loop
        
        rs.Close
        Set rs = NothingEnd Sub
      

  4.   

    代码有点乱,既然有公共模块,还用那么多连接干嘛?
    把连接放在公共模块内。也没必要将填充数据的函数写在公共模块内,除非你做的是通用的。但看你这样连SQL语句都是写死的,根本也就不通用了。至于其他,暂时没发现什么问题啊。你可以在加载数据的地方添加断点来调试,看看是否运行,查询出来的结果是否一致。