How to hide the vertical scroll bar in a .NET ListView Control in Details mode

前端 未结 6 1548
终归单人心
终归单人心 2020-12-01 17:11

I\'ve got a ListView control in Details mode with a single column. It\'s on a form that is meant to only be used with the keyboard, mostly with the up/down arrows for scrol

相关标签:
6条回答
  • 2020-12-01 17:37

    Call the ShowScrollBar API method.

    0 讨论(0)
  • 2020-12-01 17:37

    If ShowScrollBar doesn't work, I'm not sure how to do it.

    You could put the ListView in a panel and make the ListView wider than the panel so that the scrollbar is cut off (check SystemInformation.VerticalScrollBarWidth), but that's a horrifyingly ugly hack.

    0 讨论(0)
  • 2020-12-01 17:40

    i did something more easy. i left scrollable to true and used a custom slider(colorSlider) that i found on codeproject and i drawed the slider over the position where the vscroller would appear and then used the ensureVisible function.

    0 讨论(0)
  • 2020-12-01 17:46

    You can use ListView.Scrollable Property. Set it to false and Scroll bars won't appear!

    0 讨论(0)
  • 2020-12-01 17:49

    Since ShowScrollBar didn't work, maybe this helps:

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, int wParam, int lParam);
    
    private const int WM_VSCROLL = 0x115;
    private const int SB_LINEDOWN = 1;
    
    public Form1()
    {
        InitializeComponent();
        for (int i = 0; i < 100; i++)
            listView1.Items.Add("foo" + i);
        listView1.Scrollable = false;
    }
    
    private void listView1_SelectedIndexChanged(object sender, EventArgs e)
    {
        SendMessage(listView1.Handle, WM_VSCROLL, SB_LINEDOWN, 0);
    }
    
    0 讨论(0)
  • 2020-12-01 17:54

    It's not easy but it can be done. If you try to hide the scroll bar through ShowScrollBar, the ListView will simply put it back again. So you have to do something more devious.

    You will have to intercept the WM_NCCALCSIZE message, and in there, turn off the vertical scroll style. Whenever the listview tries to turn it on again, you will turn it off again in this handler.

    public class ListViewWithoutScrollBar : ListView
    {
        protected override void WndProc(ref Message m) {
            switch (m.Msg) {
                case 0x83: // WM_NCCALCSIZE
                    int style = (int)GetWindowLong(this.Handle, GWL_STYLE);
                    if ((style & WS_VSCROLL) == WS_VSCROLL)
                        SetWindowLong(this.Handle, GWL_STYLE, style & ~WS_VSCROLL);
                    base.WndProc(ref m);
                    break;
                default:
                    base.WndProc(ref m);
                    break;
            }
        }
        const int GWL_STYLE = -16;
        const int WS_VSCROLL = 0x00200000;
    
        public static int GetWindowLong(IntPtr hWnd, int nIndex) {
            if (IntPtr.Size == 4)
                return (int)GetWindowLong32(hWnd, nIndex);
            else
                return (int)(long)GetWindowLongPtr64(hWnd, nIndex);
        }
    
        public static int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong) {
            if (IntPtr.Size == 4)
                return (int)SetWindowLongPtr32(hWnd, nIndex, dwNewLong);
            else
                return (int)(long)SetWindowLongPtr64(hWnd, nIndex, dwNewLong);
        }
    
        [DllImport("user32.dll", EntryPoint = "GetWindowLong", CharSet = CharSet.Auto)]
        public static extern IntPtr GetWindowLong32(IntPtr hWnd, int nIndex);
    
        [DllImport("user32.dll", EntryPoint = "GetWindowLongPtr", CharSet = CharSet.Auto)]
        public static extern IntPtr GetWindowLongPtr64(IntPtr hWnd, int nIndex);
    
        [DllImport("user32.dll", EntryPoint = "SetWindowLong", CharSet = CharSet.Auto)]
        public static extern IntPtr SetWindowLongPtr32(IntPtr hWnd, int nIndex, int dwNewLong);
    
        [DllImport("user32.dll", EntryPoint = "SetWindowLongPtr", CharSet = CharSet.Auto)]
        public static extern IntPtr SetWindowLongPtr64(IntPtr hWnd, int nIndex, int dwNewLong);
    }
    

    This will give you a ListView without scroll bars that still scrolls when you use the arrow keys to change selection.

    0 讨论(0)
提交回复
热议问题