代码改变世界

以前的学习经历...VB Collection对象的Add

2010-05-31 16:56  DeguangLi  阅读(679)  评论(0编辑  收藏  举报

发表时间:2006年1月19日 4时44分

今晚很郁闷,竟然为了被ByRef耍了一晚上… ,终于在偶的n遍调试下终于发现是什么问题导致的.ho~~ 爽!~做程序就是这样.我喜欢解决问题后的成就感.. 这里呢我说一下Coolection的强大功能.可以add引用的东东.今晚就是被它耍了几个小时…nnd!! 事情是这样的.. 我需要把程序返回的一个对象添加到集合对象里面去,在添加的时候呢我是这样写的:

Private Sub FillData(Subjects As Collection) 
    
Dim temp As new clsItemQuestion 
    
While Not myDBManager.rst.EOF 
        temp.Grade 
= CStr(myDBManager.rst!Grade) 
        temp.ID 
= CStr(myDBManager.rst!sub_id) 
        temp.Name 
= CStr(myDBManager.rst!sub_name) 
        Subjects.Add temp 
        myDBManager.rst.MoveNext 
    
Wend 
    
Set temp = Nothing 
End Sub 

一开始呢,我直接实例化一个类,然后为这个对象属性赋值,最后把这个对象添加到集合里面去.这里隐藏了一个很隐蔽的错误,就是集合对象存放的不是一个新的类,也就是说,它存放的就是开始实例化"Dim temp as new clsItemQuestion"这个对象,因为我只实例化了一个.所以在存放到里面之后呢,我发现无论我增加多少个,取出的数据个数虽然不会少,但里面的每一个数据都是最后一个添加进去的数据.也就是说当我第一次放进 Grade=1,ID=2,Name=abc,下次再放进去的话,前一次放进的数据会跟着当前数据变化而变化,这是因为Collection 集合对象是按引用存放的,集合里面虽然存放的对象越来越多,但终归为一个对象的引用.所以导致了所有数据(其实就是全部都是本身)都一样.要想添加对象进去,必须每次都实例化一个对象.这样的每个对象才是真正独立的对象.也就避免了上述的问题!解决代码如下:

Private Sub FillData(Subjects As Collection) 
    
Dim temp As clsItemQuestion 
    
While Not myDBManager.rst.EOF 
        
Set temp = New clsItemQuestion 
        temp.Grade 
= CStr(myDBManager.rst!Grade) 
        temp.ID 
= CStr(myDBManager.rst!sub_id) 
        temp.Name 
= CStr(myDBManager.rst!sub_name) 
        Subjects.Add temp 
        myDBManager.rst.MoveNext 
    
Wend 
    
Set temp = Nothing 
End Sub