The background: Most of us know the SysListView32
common control and the equivalent wrapper ListView
class provided by th
Information:
ListView
does not have WS_HSCROLL | WS_VSCROLL
flags set in its styles.
Control
s that do not have these flags set.CreateParams
does not work either. You have to set it manually in the OnHandleCreated
method using SetWindowLong
.ShowScrollBar
for each window message forces these flags to be set.The Solution:
Define your WndProc
like the following:
protected override void WndPoc(ref Message m) { //custom code before calling base.WndProc base.WndProc(ref m); //custom after base.WndProc returns WmScroll(); //VERY INEFFICIENT, called for each message :( }
Define WmScroll() as follows:
protected virtual void WmScroll() { NativeMethods.ShowScrollBar(Handle, SB_BOTH, true); //si.fMask = SIF_PAGE | SIF_RANGE <- initialized in .ctor NativeMethods.GetScrollInfo(Handle, SB_HORZ, ref si); if(si.nMax < si.nPage) NativeMethods.EnableScrollBar(Handle, SB_HORZ, ESB_DISABLE_BOTH); else NativeMethods.EnableScrollBar(Handle, SB_HORZ, ESB_ENABLE_BOTH); NativeMethods.GetScrollInfo(Handle, SB_VERT, ref si); if(si.nMax < si.nPage) NativeMethods.EnableScrollBar(Handle, SB_VERT, ESB_DISABLE_BOTH); else NativeMethods.EnableScrollBar(Handle, SB_VERT, ESB_ENABLE_BOTH); }
It now, looks like:
These are with another item added featuring the horizontal scroll and working ListViewGroup
collapse button:
AutoResizeColumns
is required if group collapse changes effective text width, otherwise the vertical scroll bar hides the collapse buttons.