none
ListView的事件问题 RRS feed

  • 问题

  • ListView的滚动条滚动时引发一个事件

    ListView的滚动条点击时引发一个事件

    ListView的任意位置鼠标点击时引发一个事件

    以上三个事件如何实现?
    实现其中一个就帮我解决问题了,不用全都实现(当然能全实现更好了)

    2009年6月13日 8:45

答案

  • 你好!
         直接没有提供这样的事件,我们需要重写WndProc函数来定义自己的ListView:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    
    namespace MyControl
    {
        public partial class MyListView : ListView
        {
            public PageView()
            {
                InitializeComponent();
            }
            protected override void WndProc(ref Message m)
            {
                int WM_VSCROLL = 0x115;
                int WM_HSCROLL = 0x114;
    
    
                if (m.Msg == WM_VSCROLL)
                {
                    switch ((uint)m.WParam)
                    {
                        
                        case 0:
                            MessageBox.Show("up!");
                            base.WndProc(ref m);
                            break;
                        case 1:
                            MessageBox.Show("Down!");
                            base.WndProc(ref m);
                            break;
                        default:
                            base.WndProc(ref m);
                            break;
                    }
                }
    
                base.WndProc(ref m); 
    
            }
           
        }
    }

    周雪峰
    2009年6月13日 9:21
    版主

全部回复

  • 你好!
         直接没有提供这样的事件,我们需要重写WndProc函数来定义自己的ListView:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    
    namespace MyControl
    {
        public partial class MyListView : ListView
        {
            public PageView()
            {
                InitializeComponent();
            }
            protected override void WndProc(ref Message m)
            {
                int WM_VSCROLL = 0x115;
                int WM_HSCROLL = 0x114;
    
    
                if (m.Msg == WM_VSCROLL)
                {
                    switch ((uint)m.WParam)
                    {
                        
                        case 0:
                            MessageBox.Show("up!");
                            base.WndProc(ref m);
                            break;
                        case 1:
                            MessageBox.Show("Down!");
                            base.WndProc(ref m);
                            break;
                        default:
                            base.WndProc(ref m);
                            break;
                    }
                }
    
                base.WndProc(ref m); 
    
            }
           
        }
    }

    周雪峰
    2009年6月13日 9:21
    版主
  • 能不能直接重写ListView的WndProc而不是使用自定义的控件呢? 因为我已经添加了ListView,而且与其关联的代码也很多了,不想替换掉。
    2009年6月13日 10:53
  • 那样不行啊!不使用自定义控件,就不能重写方法了啊!
    这些事件本身没有提供!不行的话换其他思路吧!
    周雪峰
    2009年6月13日 11:05
    版主