c# 用treeView控件生成行政区划代码树速度太慢,请高手优化!

时间:2022-12-12 16:03:10
以下代码生成行政区划代码树,但速度太慢,请高手优化。数据表和样例如下图:
 private void textBox7_DoubleClick(object sender, EventArgs e)
        {
            
            OleDbConnection oleCon = getConnection();
            oleCon.Open();
            OleDbCommand oleCom = new OleDbCommand("select * from sysCode where CodeID=Parent and TypeId='AB'", oleCon);
            OleDbDataReader dr = oleCom.ExecuteReader();
            while (dr.Read())
            {
                OleDbCommand oleCom1 = new OleDbCommand("select * from sysCode where CodeID <> Parent  and Parent='" + dr[1].ToString() + "'and TypeId='AB'", oleCon);

                OleDbDataReader dr1 = oleCom1.ExecuteReader();
                TreeNode newNode1 = treeView1.Nodes.Add(dr[1].ToString(), dr[2].ToString());
                while (dr1.Read())
                {
                    TreeNode newNode2 = newNode1.Nodes.Add(dr1[1].ToString(), dr1[2].ToString());
                    OleDbCommand oleCom2 = new OleDbCommand("select * from sysCode where CodeID = Child and Parent='" + dr1[1].ToString() + "'and TypeId='AB'", oleCon);
                    OleDbDataReader dr2 = oleCom2.ExecuteReader();
                    while (dr2.Read())
                    {
                        newNode2.Nodes.Add(dr2[1].ToString(), dr2[2].ToString());
                    }
                    dr2.Close();

                }
                dr1.Close();
            }
            treeView1.CollapseAll();
            dr.Close();
            oleCon.Close();
            treeView1.Visible = true;

        }
c# 用treeView控件生成行政区划代码树速度太慢,请高手优化!
http://album.alumni.163.com/uploadnew/30/25/81/812530/1222354252483.jpg

8 个解决方案

#1


c# 用treeView控件生成行政区划代码树速度太慢,请高手优化!

#2


开始只生成第一层的所有第一层子节点,然后当点某一个节点的时候再去读他所有的第一层子节点

#3


不知为什么我上传图片显示不了!请直接在ie窗口显示!
http://album.alumni.163.com/uploadnew/30/25/81/812530/1222354222809.jpg
http://album.alumni.163.com/uploadnew/30/25/81/812530/1222354252483.jpg

#4


引用 2 楼 wartim 的回复:
开始只生成第一层的所有第一层子节点,然后当点某一个节点的时候再去读他所有的第一层子节点

请问点开节点的事件是哪个?

#5


private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)

#6


说一个想法,自己还没有验证过。
如果觉得treeview速度慢的话,是否可以在内存中另外使用一个速度快的存储结构呢?然后在这个存储结构和treeview之间建立数据的映射。

#7


引用 6 楼 JackLucifer 的回复:
说一个想法,自己还没有验证过。 
如果觉得treeview速度慢的话,是否可以在内存中另外使用一个速度快的存储结构呢?然后在这个存储结构和treeview之间建立数据的映射。

不太明白,本人数据库学的不是很好!搞了几年j2ee。现在刚开始学习C# 呵呵!!

#8


j2ee也好,c#也好,都是一种程序设计语言,是一种兵器,玩得再好,也只能达到赤尊信的程度。
但是,数据结构、算法、网络技术、数据库技术等等这些基础知识,却是构建起软件帝国的基石,是软件帝国得以运转的核心,只有掌握了这些,才能达到浪翻云和庞班这种上窥天道的境界。

我是没有资格说这些话的,因为我毕竟不是这个圈子里面的人,也没有这方面的实践经验,但是从我所学的东西来看,这个方法似乎是到处都存在的:

CPU中,为了解决内存读取速度和CPU运算速度之间的巨大差距,设置了一级、二级缓存,你可以将它想象成:将硬盘中100%的数据读取50%到内存,再读取20%到二级缓存,再读取5%到一级缓存,这个是稍微了解CPU硬件的人都会知道的。

这种缓存机制,不仅在CPU中存在,在硬盘、光驱等硬件中存在,在操作系统中也是存在的,比如:windows的临时交换文件,还有现在vista的ReadyBoost技术和Superfetch技术。

不仅如此,软件工程中,三层的架构设计也带有一点“缓存机制”的味道,比如:数据操作层就是底层的数据库、文件等数据与业务对象层之间的缓冲区,无论下面怎么变,只要对上面的接口不变,就不会影响上面的业务对象层的运作。

诸如此类的例子还有很多,也不仅仅在软件方面,或计算机领域。小到橡皮垫、弹簧,大到舰载机上的阻拦索和钩子、航天器的对接缓冲,都会使用到这种“缓存机制”或“缓冲机制”,其本质,就是将两个不同速度、不同能量、不同吞吐量的事物或事务平滑的对接起来。

所以,如果你觉得treeview速度很慢,不能满足你的需要,但又不想放弃这个控件的话,那么可以自己做一个能够快速定位读取的存储结构,将硬盘中读取来的数据存放到这个存储结构中,然后在treeview中直接调用这个存储结构中的数据,也就是说,让这个存储结构起到缓冲的作用。我想,这个思路,其实,用j2ee和c#都是可以实现的,不是吗?

#1


c# 用treeView控件生成行政区划代码树速度太慢,请高手优化!

#2


开始只生成第一层的所有第一层子节点,然后当点某一个节点的时候再去读他所有的第一层子节点

#3


不知为什么我上传图片显示不了!请直接在ie窗口显示!
http://album.alumni.163.com/uploadnew/30/25/81/812530/1222354222809.jpg
http://album.alumni.163.com/uploadnew/30/25/81/812530/1222354252483.jpg

#4


引用 2 楼 wartim 的回复:
开始只生成第一层的所有第一层子节点,然后当点某一个节点的时候再去读他所有的第一层子节点

请问点开节点的事件是哪个?

#5


private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)

#6


说一个想法,自己还没有验证过。
如果觉得treeview速度慢的话,是否可以在内存中另外使用一个速度快的存储结构呢?然后在这个存储结构和treeview之间建立数据的映射。

#7


引用 6 楼 JackLucifer 的回复:
说一个想法,自己还没有验证过。 
如果觉得treeview速度慢的话,是否可以在内存中另外使用一个速度快的存储结构呢?然后在这个存储结构和treeview之间建立数据的映射。

不太明白,本人数据库学的不是很好!搞了几年j2ee。现在刚开始学习C# 呵呵!!

#8


j2ee也好,c#也好,都是一种程序设计语言,是一种兵器,玩得再好,也只能达到赤尊信的程度。
但是,数据结构、算法、网络技术、数据库技术等等这些基础知识,却是构建起软件帝国的基石,是软件帝国得以运转的核心,只有掌握了这些,才能达到浪翻云和庞班这种上窥天道的境界。

我是没有资格说这些话的,因为我毕竟不是这个圈子里面的人,也没有这方面的实践经验,但是从我所学的东西来看,这个方法似乎是到处都存在的:

CPU中,为了解决内存读取速度和CPU运算速度之间的巨大差距,设置了一级、二级缓存,你可以将它想象成:将硬盘中100%的数据读取50%到内存,再读取20%到二级缓存,再读取5%到一级缓存,这个是稍微了解CPU硬件的人都会知道的。

这种缓存机制,不仅在CPU中存在,在硬盘、光驱等硬件中存在,在操作系统中也是存在的,比如:windows的临时交换文件,还有现在vista的ReadyBoost技术和Superfetch技术。

不仅如此,软件工程中,三层的架构设计也带有一点“缓存机制”的味道,比如:数据操作层就是底层的数据库、文件等数据与业务对象层之间的缓冲区,无论下面怎么变,只要对上面的接口不变,就不会影响上面的业务对象层的运作。

诸如此类的例子还有很多,也不仅仅在软件方面,或计算机领域。小到橡皮垫、弹簧,大到舰载机上的阻拦索和钩子、航天器的对接缓冲,都会使用到这种“缓存机制”或“缓冲机制”,其本质,就是将两个不同速度、不同能量、不同吞吐量的事物或事务平滑的对接起来。

所以,如果你觉得treeview速度很慢,不能满足你的需要,但又不想放弃这个控件的话,那么可以自己做一个能够快速定位读取的存储结构,将硬盘中读取来的数据存放到这个存储结构中,然后在treeview中直接调用这个存储结构中的数据,也就是说,让这个存储结构起到缓冲的作用。我想,这个思路,其实,用j2ee和c#都是可以实现的,不是吗?