110,535
社区成员
发帖
与我相关
我的任务
分享
public void 加载(TreeNodeCollection 数据, TreeNodeCollection 实际控件)
{
加载(数据, 实际控件, 0);
}
public int 加载(TreeNodeCollection 数据, TreeNodeCollection 实际控件, int index)
{
foreach (TreeNode n in 数据)
{
var r = n.Nodes;
n.Nodes.Clear();
实际控件.Add(n);
index++;
if (index <= 30)
index = 加载(r, n.Nodes, index); //把r加载到n下边
else //如果大于30步则异步加载
ThreadPool.QueueUserWorkItem(h =>
{
this.BeginInvoke((Action)delegate
{
加载(r, n.Nodes, 0); //把r加载到n下边,index从0开始计数
});
});
}
return index;
}
你可以清晰地看到,实际上想当然地“另开一个线程计算得到庞大的 treeNodeRoot”好像挺高大上似地,好像很技术化似地,其实它一点也不技术。单纯技术化是很幼稚的,它反而造成你不得不写出非常复杂、诡异的后续代码。
而如果你稍微动脑筋、用心设计一个“事件驱动”模型,你只需要得到2层节点的 treeNodeRoot,然后在加入节点时动态注册监听其 Expand 事件,在事件中再去判断对于当前 第 n 层节点是否需要加载第 n+2层子节点,只要这样离散地把数据模型插入用户交互细节中,你的“计算子节点”的业务逻辑是细节的、小的,你的程序的用户体验是好的、流畅的。而且代码写起来也很简单,比上面的这个要容易理解多了。