现在要做一个功能,比如我的数据源有10000条数据,通过屏幕判断当前屏幕可以显示20条,我在拖动滚动条和点击滚动条的上下按钮或则鼠标的滚轮时都需要对当前屏幕的20条数据进行判断然后做其他操作。自己写事件的话会有问题,比如我点击滑块进行拖动时会调用无数次事件。如何才能只获得滑块滚动停止后的事件,一次点击或则一次拖动或则一次滚轮只调用一次事件?
        const int WM_VSCROLL = 0x0115;
        const int WM_HSCROLL = 0x0114;        protected override void WndProc(ref Message m)
        {
           
            if (m.Msg == WM_VSCROLL)
            {
                OnVScroll(this, new EventArgs());
                this.Refresh();
            }
            else if (m.Msg == WM_HSCROLL)
            {
                OnHScroll(this, new EventArgs());
                this.Refresh();
            }            base.WndProc(ref m);
        }

解决方案 »

  1.   

    ListView本身就支持VirtualMode,何苦如此大费周章参考:http://msdn.microsoft.com/zh-cn/library/system.windows.forms.listview.virtualmode.aspx
      

  2.   

    请问能给我一个思路吗?~~如何使用VirtualMode来实现10000条数据的显示~~前提是当滚动条拖动到哪的时候只加载当前框中的数据~~
      

  3.   

    给你的msdn链接里面不是有代码么。
      

  4.   

     private void button1_Click(object sender, EventArgs e)
            {
                           System.Diagnostics.Stopwatch sp = new System.Diagnostics.Stopwatch();
                sp.Start();
                
                for (int i = 0; i < 100000; i++)
                {
                    ListViewItem lvi = new ListViewItem(new string[] { i.ToString(), "asd" });
                    lvi.Name = i.ToString();
                    datas.Add(lvi);
                }            this.listView2.VirtualListSize = 100000;
                this.listView2.RetrieveVirtualItem += new  RetrieveVirtualItemEventHandler(listView_RetrieveVirtualItem);
            }        private List<ListViewItem> datas = new List<ListViewItem>();        void listView_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
            {            if (this.datas == null || this.datas.Count == 0)
                {
                    return;
                }            e.Item = this.datas[e.ItemIndex];
                if (e.ItemIndex == this.datas.Count)
                {
                    this.datas = null;
                }
            }