■ はじめに
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