如何解决效率问题!
界面的功能类似于资源管理器。左面一个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执行的次数远远多于应该执行的次数。而且这样做还要对并发性进行额外的处理。
补充:.NET技术 , VB.NET