我有一段程序,需要每5秒更新listview里的内容,更新方法如下
MylistView.Items.Clear();//先清空原来的内容
MylistView.Items.Add(Item1)//将新内容逐个添加
MylistView.Items.Add(Item2)
……
这样会造成每次更新数据时屏幕都因listview刷新而闪动(类似于Web页面的刷新),效果很不好,更糟的是每次刷新后listview滚动条都会弹到最上方,几乎无法看下面的数据了。 
这个问题有办法解决吗?

解决方案 »

  1.   

    MylistView.BeginUpdate();
    ...
    MylistView.EndUpdate();
      

  2.   

    popcorn(米花.珠海) ( ) 信誉:102  2005-02-28 17:57:00  得分: 0  
     
     
       MylistView.BeginUpdate();
    ...
    MylistView.EndUpdate();
      
     
      

  3.   

    BeginUpdate 和 EndUpdate 并不能解决我的问题。因为我的listview需要随时更新(每5秒一次),用了BeginUpdate 和 EndUpdate还是要5秒刷新一次,依然闪动的很频繁。最重要的是每次闪动后滚动条都自动弹到了ListView的最上方,几乎无法使用。
    我希望Listview在更新数据时能保持原来的状态,类似于OutLook那样:当列表中出现新邮件时,滚动条的位置、原先哪一行被选中都不会改变。
      

  4.   

    b/s程序都是这样的,因为客户端要刷新数据,标准方式必须向服务器段提交请求,所以会闪,用xmlhttp方式提交可以避免闪动。
      

  5.   

    你可以再重新定义listview当前所选择的项呀。
      

  6.   

    1.我的listview是WinForm的
    2.确实可以在数据更新前纪录下来哪些行被选中了`,然后在更新后再次选中它们。但个人认为这应该不是最佳办法
    3.就算我使用2中的办法,也只能解决“保持选中行”的问题;滚动条还是会自动弹到最上方,这个怎么办呢我觉得应该有一个系统的解决方法。就像web页面也有办法防止刷新所带来的种种不好的效果(好像是在页头设一个什么smart属性就可以,具体记不得了)。唉期待高手
      

  7.   

    ListView.EnsureVisible(ListView.Items.Count - 1);不满足你的要求就自己写吧,写起来有点复杂。
    参考一下www.codeproject.com的文章。
    重载winproc函数,在paint消息中修改。
      

  8.   

    MylistView.Items.Clear();//先清空原来的内容
    MylistView.Items.Add(Item1)//将新内容逐个添加
    MylistView.Items.Add(Item2)你可不可以考虑,记住你刷新后,内容的改变呢??
    然后只更新改变的项,就不需要clear了,那么是不是会很好呢
    这样排列顺序也不会变的
    然后用ListView.EnsureVisible(ListView.Items.Count - 1);
    应该就可以了!