
c# winform treeview问题
treeview里追加节点时,由于数据量太大,现在出现的问题就是画面在读入数据加载treeview时,会出现刷屏现象,一闪一闪.现代码如下://root节点设定forea...
treeview里追加节点时,由于数据量太大,现在出现的问题就是画面在读入数据加载treeview时,会出现刷屏现象,一闪一闪.现代码如下:
//root节点设定
foreach (string rootId in rootNodeList)
{
treeview.Nodes.Add(rootId , rootId );
}
//子节点设定
foreach (string node in rootNodeList)
{
treeview.SelectedNode = treeview.Nodes[node];
//递归取得该节点所有子节点
this.setNode(node);
}
//递归
private void setNode(string targetNodeDataId)
{
//相同根节点的节点集合取得
List<string> sameParentNodeIdList = getSameParentNodeIdList (targetNodeDataId);
foreach (string nodeId in sameParentNodeIdList)
{
treeview.SelectedNode =
treeview.Nodes.Find(targetNodeDataId, true)[0];
treeview.SelectedNode.Nodes.Add(nodeId , nodeId );
}
setNode(nodeId );
}
此方法是找到一个节点就追加一个,这样数据量大时,就会出现刷屏现象,一闪一闪,挺恶心,有没有好的方法可以实现就是,让所有数据节点都组织好了,一下子绑定到treeview上啊(动态追加treeview除外,因为不能用此方法,原因就不多说).
递归方法写错了,更正如下
private void setNode(string targetNodeDataId)
{
//相同根节点的节点集合取得
List<string> sameParentNodeIdList = getSameParentNodeIdList (targetNodeDataId);
foreach (string nodeId in sameParentNodeIdList)
{
treeview.SelectedNode =
treeview.Nodes.Find(targetNodeDataId, true)[0];
treeview.SelectedNode.Nodes.Add(nodeId , nodeId );
//递归
setNode(nodeId );
}
} 展开
//root节点设定
foreach (string rootId in rootNodeList)
{
treeview.Nodes.Add(rootId , rootId );
}
//子节点设定
foreach (string node in rootNodeList)
{
treeview.SelectedNode = treeview.Nodes[node];
//递归取得该节点所有子节点
this.setNode(node);
}
//递归
private void setNode(string targetNodeDataId)
{
//相同根节点的节点集合取得
List<string> sameParentNodeIdList = getSameParentNodeIdList (targetNodeDataId);
foreach (string nodeId in sameParentNodeIdList)
{
treeview.SelectedNode =
treeview.Nodes.Find(targetNodeDataId, true)[0];
treeview.SelectedNode.Nodes.Add(nodeId , nodeId );
}
setNode(nodeId );
}
此方法是找到一个节点就追加一个,这样数据量大时,就会出现刷屏现象,一闪一闪,挺恶心,有没有好的方法可以实现就是,让所有数据节点都组织好了,一下子绑定到treeview上啊(动态追加treeview除外,因为不能用此方法,原因就不多说).
递归方法写错了,更正如下
private void setNode(string targetNodeDataId)
{
//相同根节点的节点集合取得
List<string> sameParentNodeIdList = getSameParentNodeIdList (targetNodeDataId);
foreach (string nodeId in sameParentNodeIdList)
{
treeview.SelectedNode =
treeview.Nodes.Find(targetNodeDataId, true)[0];
treeview.SelectedNode.Nodes.Add(nodeId , nodeId );
//递归
setNode(nodeId );
}
} 展开
4个回答
展开全部
TreeView tv = new TreeView();
try
{
tv.BeginUpdate();
// 添加节点
}
finally
{
tv.EndUpdate();
}
try
{
tv.BeginUpdate();
// 添加节点
}
finally
{
tv.EndUpdate();
}
更多追问追答
追问
你好,感谢你的回答,用了这个方法后,treeview里面是不闪了,但是treeview控件的滚动条,就在那滚啊滚啊,很搞笑,如果设置Scrollable=false,那BeginUpdate();这个就不管用了好像,节点数据还是先加载进去了,我现在想在节点添加时,就是在上边递归时,能否加个进度条,等进度条加载完毕,节点也追加完毕,画面显示,具体做法能否给个详细的代码,我也在网上找了资料,我要详细的.我对这不懂,保证再给你20分
追答
可以先设置treeview的visible=false.加载完节点再设置visible=true.试试
我晚上抽空写写,练练手
给你粘贴了一段代码,
http://tieba.baidu.com/p/1179250268
新建一个Form,直接粘贴进去.和构造函数同级的位置就能运行.
用的是backgroundworker.
运行之前BeginUpdate 运行结束时 EndUpdate()
我试验了一下,如果treeview刷新太快,仍然会闪屏
展开全部
使用beginupdate()和endupdate()
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询