有没有一种方法可以阻止水平滚动条在列表视图中出现?我希望垂直滚动条在需要时显示,但我希望水平滚动条永远不会显示。我想这和Wndproc有关系吧?谢谢
deikduxw1#
有一个简单得多的方法来消除较低的滚动条,并有垂直显示。它包括确保标题,如果没有标题,则行的宽度为listview.Width - 4,如果显示垂直滚动条,则显示listview.Width - Scrollbar.Width - 4;下面的代码演示了如何:
listview.Width - 4
listview.Width - Scrollbar.Width - 4;
lv.Columns[0].Width = lv.Width - 4 - SystemInformation.VerticalScrollBarWidth;
ycl3bljg2#
最好的解决方案是这里给出的公认答案:How to hide the vertical scroll bar in a .NET ListView Control in Details mode它工作完美,你不需要一些技巧,如列宽调整。此外,您可以在创建控件时禁用滚动条。缺点是您必须创建自己的列表视图类,该类派生自System.Windows.Forms.ListView以覆盖WndProc。但这是唯一的办法。要禁用水平滚动条,请记住使用WS_HSCROLL而不是WS_VSCROLL(在链接的答案中使用)。WS_HSCROLL的值是0x00100000。
System.Windows.Forms.ListView
WndProc
WS_HSCROLL
WS_VSCROLL
0x00100000
6ss1mwsb3#
currently accepted answer是不安全的,因为它使堆栈不平衡。对于DllImport,您应该使用以下代码:
[System.Runtime.InteropServices.DllImport("user32", CallingConvention=System.Runtime.InteropServices.CallingConvention.Winapi)] [return: System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.Bool)] private static extern bool ShowScrollBar(IntPtr hwnd, int wBar, [System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.Bool)] bool bShow);
Andreas雷夫在他的评论中再次查看后涵盖了这一点,所以我想这里的所有格式都很好。要使用它:
# Use one of these valued for hwnd long SB_HORZ = 0; long SB_VERT = 1; long SB_BOTH = 3; # Use the actual name of the ListView control in your code here # Hides the specified ListView scroll bar ShowScrollBar(listView1.Handle.ToInt64(), SB_BOTH, 0);
要强制它 * 显示 * 而不是 * 隐藏 *,只需将bShow从0更改为1,因为0等于false,1等于true。
bShow
0
1
false
true
lskq00tm4#
你可以尝试这样的东西,我曾经在一个项目中使用过,它很有效:
[DllImport ("user32")] private static extern long ShowScrollBar (long hwnd , long wBar, long bShow); long SB_HORZ = 0; long SB_VERT = 1; long SB_BOTH = 3; private void HideHorizontalScrollBar () { ShowScrollBar(listView1.Handle.ToInt64(), SB_HORZ, 0); }
希望能帮上忙。
n9vozmp45#
如果你想要一个列表视图,显示图标或值为水平只需要设置***对齐左***
92dk7w1h6#
我个人正在寻找非常相似的东西,但无法找到如何删除滚动条,但仍然得到鼠标滚轮的工作列表视图。我知道这并不完全涉及到最初的问题,但是如果有人偶然发现这个页面,希望删除两个滚动条,但仍然有垂直滚动功能,这里是这样做的代码!我在网上搜索了一下,找不到答案,这里问的问题非常非常相似,所以请不要恨我在这里张贴这个。不要害怕我的while(1==1)循环哈哈!此外,这是补丁工作代码从许多来源,包括我自己的,所以我不能采取充分的信贷,也不知道它的一些原始来源。只需使用此代码创建一个新的自定义控件(将命名空间更改为您想要的)。你可以改变你的design.cs文件的形式,它的和引用这个控件,而不是原来的ListView(2行代码)。确保Scrollable设置为true,但也要将ScrollOverride设置为true,否则它将作为普通的ListView。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Runtime.InteropServices; using System.Windows.Forms; namespace LancourWestbrook.Controls { public partial class TPListView : ListView { [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); const int GWL_STYLE = -16; const int WS_VSCROLL = 0x00200000; const int WS_HSCROLL = 0x00100000; const int WM_MOUSEWHEEL = 0x20a; const int WM_NCCALCSIZE = 0x83; public TPListView() { InitializeComponent(); } public TPListView(IContainer container) { container.Add(this); InitializeComponent(); } private int? LastItemIndexInView { get { if (this.Items == null || this.Items.Count <= 0) { return null; } List<int> items = new List<int>(); int topIndex = this.TopItem.Index; int currentIndex = topIndex; items.Add(topIndex); while (1 == 1) { currentIndex++; if (this.Items.Count - 1 < currentIndex) { break; } if (this.Items[currentIndex].Bounds.IntersectsWith(this.ClientRectangle)) { items.Add(currentIndex); } else { break; } } return currentIndex; } } public bool ScrollOverride { get; set; } protected override void WndProc(ref Message m) { if (ScrollOverride == false) { base.WndProc(ref m); return; } switch (m.Msg) { case WM_MOUSEWHEEL: if (this.Items == null || this.Items.Count <= 0) { break; } var zDelta = (short)HIWORD(m.WParam); if (zDelta < 0) { //Scroll Downwards int? lastItemInView = LastItemIndexInView; if (lastItemInView.HasValue && this.Items.Count > lastItemInView.Value + 1) { this.Items[lastItemInView.Value + 1].EnsureVisible(); } else if (this.Items.Count > 0) { this.Items[this.Items.Count - 1].EnsureVisible(); } } else if (zDelta > 0) { //Scroll Upwards int topItemInView = this.TopItem.Index; if (topItemInView > 0) { this.Items[topItemInView - 1].EnsureVisible(); } } break; case WM_NCCALCSIZE: int style = (int)GetWindowLong(this.Handle, GWL_STYLE); if ((style & WS_VSCROLL) == WS_VSCROLL) SetWindowLong(this.Handle, GWL_STYLE, style & ~WS_VSCROLL); if ((style & WS_HSCROLL) == WS_HSCROLL) SetWindowLong(this.Handle, GWL_STYLE, style & ~WS_HSCROLL); base.WndProc(ref m); break; default: base.WndProc(ref m); break; } } 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); } internal static ushort HIWORD(IntPtr dwValue) { return (ushort)((((long)dwValue) >> 0x10) & 0xffff); } } }
也许有人也可以添加代码,鼠标滚轮点击并保持水平滚动!
6条答案
按热度按时间deikduxw1#
有一个简单得多的方法来消除较低的滚动条,并有垂直显示。它包括确保标题,如果没有标题,则行的宽度为
listview.Width - 4
,如果显示垂直滚动条,则显示listview.Width - Scrollbar.Width - 4;
下面的代码演示了如何:
ycl3bljg2#
最好的解决方案是这里给出的公认答案:How to hide the vertical scroll bar in a .NET ListView Control in Details mode
它工作完美,你不需要一些技巧,如列宽调整。此外,您可以在创建控件时禁用滚动条。
缺点是您必须创建自己的列表视图类,该类派生自
System.Windows.Forms.ListView
以覆盖WndProc
。但这是唯一的办法。要禁用水平滚动条,请记住使用
WS_HSCROLL
而不是WS_VSCROLL
(在链接的答案中使用)。WS_HSCROLL
的值是0x00100000
。6ss1mwsb3#
currently accepted answer是不安全的,因为它使堆栈不平衡。对于DllImport,您应该使用以下代码:
Andreas雷夫在他的评论中再次查看后涵盖了这一点,所以我想这里的所有格式都很好。
要使用它:
要强制它 * 显示 * 而不是 * 隐藏 *,只需将
bShow
从0
更改为1
,因为0
等于false
,1
等于true
。lskq00tm4#
你可以尝试这样的东西,我曾经在一个项目中使用过,它很有效:
希望能帮上忙。
n9vozmp45#
如果你想要一个列表视图,显示图标或值为水平只需要设置***对齐左***
92dk7w1h6#
我个人正在寻找非常相似的东西,但无法找到如何删除滚动条,但仍然得到鼠标滚轮的工作列表视图。我知道这并不完全涉及到最初的问题,但是如果有人偶然发现这个页面,希望删除两个滚动条,但仍然有垂直滚动功能,这里是这样做的代码!我在网上搜索了一下,找不到答案,这里问的问题非常非常相似,所以请不要恨我在这里张贴这个。不要害怕我的while(1==1)循环哈哈!此外,这是补丁工作代码从许多来源,包括我自己的,所以我不能采取充分的信贷,也不知道它的一些原始来源。只需使用此代码创建一个新的自定义控件(将命名空间更改为您想要的)。你可以改变你的design.cs文件的形式,它的和引用这个控件,而不是原来的ListView(2行代码)。确保Scrollable设置为true,但也要将ScrollOverride设置为true,否则它将作为普通的ListView。
也许有人也可以添加代码,鼠标滚轮点击并保持水平滚动!