当前位置:编程学习 > C#/ASP.NET >>

如何解决效率问题!

界面的功能类似于资源管理器。左面一个treeview显示部门结构,右边datagridview显示部门的人员名单。当单击treeview的节点时设置node的cheeck属性true,同时设置这个节点的所有子节点(包括子节点的子节点,一直到叶节点)。
代码如下。可是这样做效率实在不敢恭维,ReSetDgv要被执行无数次。
希望高手帮我改下。谢谢了

    Private Sub tree_AfterCheck(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles tree.AfterCheck
        For Each node As TreeNode In e.Node.Nodes
            node.Checked = e.Node.Checked
        Next
        If FirstCheck Then
        Else
            Application.DoEvents()
            dgv.Tag = Nothing
            ReSetDgv()
    End Sub

    Private Sub ReSetDgv()
        For Each b As TreeNode In tree.Nodes
            If b.Checked Then
                Dim bumen As 部门信息表 = b.Tag
                Dim yuangong = From row In db.员工信息表 Where row.所在部门 = bumen.Name Order By row.id
                If dgv.Tag IsNot Nothing Then
                    yuangong.Count()
                    yuangong = yuangong.Union(dgv.Tag)
                End If
                dgv.Tag = yuangong
            End If
            ReSetDgv(b)
        Next
        Try
            dgv.DataSource = dgv.Tag
        Catch ex As Exception

        End Try
    End Sub
    Private Sub ReSetDgv(ByVal node As TreeNode)
        For Each b As TreeNode In node.Nodes
            If b.Checked Then
                Dim bumen As 部门信息表 = b.Tag
                Dim yuangong = From row In db.员工信息表 Where row.所在部门 = bumen.Name Order By row.id
                If dgv.Tag IsNot Nothing Then
                    yuangong.Count()
                    yuangong = yuangong.Union(dgv.Tag)
                End If
                dgv.Tag = yuangong
            End If
            ReSetDgv(b)
        Next
    End Sub --------------------编程问答-------------------- ... --------------------编程问答-------------------- 只需要对选中的进行展开就可以 --------------------编程问答-------------------- 这样就可以了吧,只处理check状态发生改变的节点   
 
Private Sub tree_AfterCheck(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles tree.AfterCheck 
        ReSetDgv(e.node) 
    End Sub 
--------------------编程问答-------------------- 给个方法供参考!
.你的方法是重载了过程可以不是递归啊!(这与速度无关!)
.TreeView 加载大量数据最完美的方法是展开时加载下级,这在读取磁盘信息最常用,
  如果你是读取数据库的话每次展开下级连接数据是非常耗资源的,所以不能使用展开读取数据的方法
  所以你可以使用数据和界面分开的方式!
  就是:
       先一次性读取所有数据到类中,这种读取方法也需要将数据按级别分好.

       public class Mynode
              dim subNode as mynode
              dim Checked as boolean
       end class
       第二使用Treeview显示此数据类,更简单的方法是将treeview.node.tag=mynode 让tag保存当前的mynode 
       实例.
       在使用Treeview读取类是只读取同级类数据
       这样当你设置TreeView的Check是就不用展开Treeview的Node并设置属性啦而只设置数据类中的Checked=True
       就好,当Node被展开后起绑定的mynode.checked为Checked为True是那你添加下级Node是就是选中.
       如果要更改展开并显示的Treeview Check属性只要游历本Node的prevnode这一级就好
   所有的操作 都可以更改数据类 Mynode 而treeview 只是显示而已

进攻参考,这种方法是可以序列化,并支持远程传输的(如果是分布式) --------------------编程问答-------------------- 非常感谢!用你的方法确实可以提高不少效率,不过还是不能解决根本问题。如果子节点本身就已经展开过了那这些工作就都白费了。而且treeview里放的是部门信息,我们公司部门的数量不会很多的,影响效率的关键是ReSetDgv执行的次数远远多于应该执行的次数。而且这样做还要对并发性进行额外的处理。
引用 4 楼 szunzermx 的回复:
给个方法供参考!
.你的方法是重载了过程可以不是递归啊!(这与速度无关!)
.TreeView 加载大量数据最完美的方法是展开时加载下级,这在读取磁盘信息最常用,
  如果你是读取数据库的话每次展开下级连接数据是非常耗资源的,所以不能使用展开读取数据的方法
  所以你可以使用数据和界面分开的方式!
  就是:
      先一次性读取所有数据到类中,这种读取方法也需要将数据按级别分好.

      public class Mynode
              dim subNode as mynode
              dim Checked as boolean
      end class
      第二使用Treeview显示此数据类,更简单的方法是将treeview.node.tag=mynode 让tag保存当前的mynode
      实例.
      在使用Treeview读取类是只读取同级类数据
      这样当你设置TreeView的Check是就不用展开Treeview的Node并设置属性啦而只设置数据类中的Checked=True
      就好,当Node被展开后起绑定的mynode.checked为Checked为True是那你添加下级Node是就是选中.
      如果要更改展开并显示的Treeview Check属性只要游历本Node的prevnode这一级就好
  所有的操作 都可以更改数据类 Mynode 而treeview 只是显示而已

进攻参考,这种方法是可以序列化,并支持远程传输的(如果是分布式)
补充:.NET技术 ,  VB.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,