【トラブル】【.NET】HScrollBar / VScrollBar でArgumentOutOfRangeExceptionが発生する

 ■ はじめに

HScrollBar / VScrollBar で独自のスクロールバーを実装していたのだが
スクロール中に、以下の「例外」が発生してしまった。

例外

System.ArgumentOutOfRangeException: 'XXXX' の値は 'Value' に対して有効ではありません。'Value' は 'minimum' と 'maximum' の間でなければなりません。
パラメーター名:Value
   ~略~
   場所 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

実装概要

  • Scrollイベントをハンドリングして、HScrollBar / VScrollBar の 以下のプロパティを動的に変更する。
    • Value
    • Minimum / Maximum
    • LargeChange / SmallChange

■ 原因

おそらくなのだが、、、

スクロールバーをユーザが変更した際に実装した以外に.NET側(?実装者が関与していない裏)で変更される。

HScrollBar / VScrollBar の Valueプロパティは、
Minimum / Maximumの範囲内に収めなくてはならないのだが
Valueプロパティ、Minimum / Maximumプロパティを動的に変更し、
更に、.NET側でValue値を裏で変更した場合に
この範囲を超えてしまっていた。

(Scrollイベントで範囲を超えたらスクロールイベントをキャンセルできれば
 発生しなかったかもしれないが、どうもそれはできない感じ)

■ 解決案

Scrollイベント でハンドリングするのではなく、
ValueChangedイベントでハンドリングし、
Valueの値が、Minimum / Maximum範囲外(特にMaximum)になった場合は、
範囲内に収まるようにValue値を補正する。

関連記事

HScrollBar / VScrollBar ~ 独自スクロールバーの実装 ~ https://dk521123.hatenablog.com/entry/38010582