Search code examples
c#.netwinformscompact-frameworkautoscroll

WinForms: How to avoid horizontal scroll bar with AutoScroll?


I'm writing a custom control that contains a list of items (child controls) that resize horizontally to fit the width of the control. If there are lots of items (or the control is resized so that it is not tall enough vertically) then a vertical scroll bar is necessary; but when the vertical scroll bar appears, the child controls are suddenly too wide, which causes a horizontal scroll bar to appear.

What's the proper way to guarantee that a horizontal scroll bar does not appear when it is not necessary, given that I am controlling the control placement manually (not relying on AnchorStyles)? (Note: I can't control the VScroll property manually because I'm on Compact Framework; and if an item's minimum width is wider than the client area then a horizontal scroll bar will be required legitimately.)


Solution

  • What I did in a similar situation was after every time I added an item to the list I detected whether the scroll bar was visible or not and adjusted my the width manually.

    What I did to detect whether the scroll bar was showing was either:

    1. Test for the WS_VSCROLL was set on the control via P/Invoke via GetWindowLong().
    2. Scan the control's children for a vertical scroll bar control.

    It depends on how the control handles scroll bars as to which one is correct.

    Also this was on Windows, not in the CF so I'm not sure if this will work exactly the same way.