c# winfrom treeview实时刷新

紫舞玥汐 2012-07-23 01:40:42
我的客户端程序里有一个treeview,用于显示服务端的某一些信息。这些信息需要实时更新,所以我在一个timer里写了刷新的方法。但是这样treeview控件上总是有闪烁,而且treeview中的项是有右键菜单的,这么一闪一闪的也不好选中一项的右键菜单啊~

后来我在百度上发求助,有人提议用线程做,我试了一下,结果treeview仍旧是不停的闪烁,并且右键菜单也是很难选中一项。
我在线程中刷新树的代码如下:

private delegate void MyInvoke();
private void ShowScreenThreadFunc()
{//在委托中执行托管代码
MethodInvoker mi = new MethodInvoker(this.RefreshDeskWindows);
this.BeginInvoke(mi);
}
private void RefreshDeskWindows()
{
if (MyMainfrom.treeViewWindows.InvokeRequired)
{
MyInvoke _myinvoke = new MyInvoke(RefreshDeskWindows);
MyMainfrom.treeViewWindows.Invoke(_myinvoke, new object[] { });
}
else
{ //这里是启动timer,timer内就是刷新treeview的代码,timer的时间间隔为1s
timerWindowsUpdate.Start();
}
}
private void frm_mcDialog_Load(object sender, EventArgs e)
{
//一些初始化......以上省略
ThreadStart myThreaddelegate = new ThreadStart(RefreshDeskWindows);
Thread myThread = new Thread(myThreaddelegate);
myThread.Start();
}


各位大侠有没有办法解决这个问题的?
我看到好像有说用mutex的,但是我对这个不熟悉,不知道有没有谁能帮我介绍一下?最好有这方面的例子。
谢谢大家~~
...全文
1266 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
maomiaomi 2013-12-02
  • 打赏
  • 举报
回复
你的问题在于服务器端更新单个节点信息时不会通知你,所以你只能获取并重新构造整棵树 你可以尝试下获取到整个信息之后将更新了的节点比较筛选出来然后更新单个节点
PaulyJiang 2013-12-02
  • 打赏
  • 举报
回复
刷新的频率高了吧
紫舞玥汐 2013-12-01
  • 打赏
  • 举报
回复
引用 10 楼 l397870376 的回复:
你的线程 不应该 执行 tv的刷新 方法 而是执行 客户端 修改了 那些信息 如果 有 修改信息 在 执行 刷新方法
你好,谢谢你的回答。我当时最大的问题是,那些信息的修改不是我客户端能控制的 之所以要刷新,就是不知道它什么时候会变,只好刷新
紫舞玥汐 2013-10-17
  • 打赏
  • 举报
回复
引用 8 楼 cyhh_h 的回复:
楼主你怎么解决的... 我也遇到跟你一样的问题了.. 最后怎么实现这个刷新的?
你好,不好意思现在才看到。 我是在程序里做了控制,有更改才刷新,没更改就不刷了。就是不用timer了,免得闪屏。 然后整个代码就变得复杂很多.... 后来,很后来,我记得我在其他功能上用到了.net自带的一个异步多线程处理的一个控件,具体名字忘了。 这个控件解决了我另一处代码,卡屏的问题。但是我没回头来改这边这个treeview,也不知道是不是能解决这个问题。
_小黑_ 2013-10-17
  • 打赏
  • 举报
回复
你的线程 不应该 执行 tv的刷新 方法 而是执行 客户端 修改了 那些信息 如果 有 修改信息 在 执行 刷新方法
勤奋的执着 2013-09-27
  • 打赏
  • 举报
回复
楼主你怎么解决的... 我也遇到跟你一样的问题了.. 最后怎么实现这个刷新的?
紫舞玥汐 2012-07-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
那能不能在节点修改的时候触发刷新树的操作呢,不用计时器刷新,这样就减少频繁频率
[/Quote]

我已经说过了,节点什么时候修改,整个树有没有增删都是不确定的。这里的treeview显示的是服务器中的一些信息,修改都在服务器,服务器不会发送是否修改的消息,只能客户端向服务器获取整个树要显示的信息。
laokaizzz 2012-07-24
  • 打赏
  • 举报
回复
那能不能在节点修改的时候触发刷新树的操作呢,不用计时器刷新,这样就减少频繁频率
紫舞玥汐 2012-07-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
mutex跟你treeview有什么关系,那是线程同步用的,想treeview中添加节点时,把添加代码放到
treeView1.BeginUpdate();
treeView1.EndUpdate();
之间,可减少频繁添加引起的闪烁
其他你还可以看看怎样刷新,是需要全部刷新,还是可以刷新一小部分呢,比如告诉你只是某个节点内容变了,你可以先搜所,然后更替该节点内容
[/Quote]

谢谢~~问题是,哪个节点修改了或者是节点什么时候被修改,这个都是不确定的。
紫舞玥汐 2012-07-23
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
我的客户端程序里有一个treeview,用于显示服务端的某一些信息。这些信息需要实时更新,所以我在一个timer里写了刷新的方法。但是这样treeview控件上总是有闪烁,而且treeview中的项是有右键菜单的,这么一闪一闪的也不好选中一项的右键菜单啊~

后来我在百度上发求助,有人提议用线程做,我试了一下,结果treeview仍旧是不停的闪烁,并且右键菜单也是很难选中一项。
我在线程中刷……
[/Quote]
谢谢1楼2楼的两位,是需要全部刷新。因为对于这棵树的增删改的操作是不确定的,数据信息全来自于服务器。服务器还有多客户端的情况需要考虑,所以很难确定哪个节点变了。
我之前用过
treeView1.BeginUpdate();
treeView1.EndUpdate();
照闪不误啊~~
isjoe 2012-07-23
  • 打赏
  • 举报
回复
刷新整个树是不明智的。。。。。。。。仅对修改或添加的节点进行刷新
bdmh 2012-07-23
  • 打赏
  • 举报
回复
mutex跟你treeview有什么关系,那是线程同步用的,想treeview中添加节点时,把添加代码放到
treeView1.BeginUpdate();
treeView1.EndUpdate();
之间,可减少频繁添加引起的闪烁
其他你还可以看看怎样刷新,是需要全部刷新,还是可以刷新一小部分呢,比如告诉你只是某个节点内容变了,你可以先搜所,然后更替该节点内容

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧