2008年09月20日
川俣晶の縁側ソフトウェア技術雑記 total 10139 count

.NET FrameworkのSystem.Windows.Forms.ScrollBar.Valueプロパティの値はマウス操作ではMaximum-LargeChange+1までしか行かない

Written By: 川俣 晶連絡先

 Windowsフォームアプリのスクロールバーの挙動が理解できずに苦しんで、それでも調査を突き詰めたら困ったことが判明。

概要 §

 .NET FrameworkのSystem.Windows.Forms.ScrollBar.Valueプロパティの値は、ドキュメントには「Minimum と Maximum の範囲内の数値」と記載されていて、確かにMaximumの値までは代入できます。

 ところが、マウスでスクロールバーを操作すると、実際にはMaximum-LargeChange+1までの値にしか行きません。それ以上、いくらボタンをクリックしても値はそれ以上に増えません。

 この挙動は、なぜかValueプロパティのドキュメントには書かれておらず、Maximum プロパティの説明に書かれています。

最大値にはプログラムによってしか到達できません。スクロール バーの値を、実行時にユーザーとのやり取りを通じて最大値にすることはできません。ユーザーとの対話型操作によって到達できる最大値は、1 に Maximum プロパティ値を加えてから LargeChange プロパティ値を引いた値と同じです。必要に応じて、Maximum プロパティには、前の項 1 を考慮して、オブジェクトのサイズよりも 1 小さい値を設定できます。

検証プログラム §

 Visual Studio 2008 SP1+.NET Framework 3.5+Windows Vista Business。

 C#のWindowsフォームアプリのプロジェクトを作成。フォーム上にLabelとvScrollBarを貼り付け。フォームのLoadと、vScrollBarのValueChangedイベントを作成後、以下のコードを入力。

private void vScrollBar1_ValueChanged(object sender, EventArgs e)

{

    label1.Text = this.vScrollBar1.Value.ToString();

}

private void Form1_Load(object sender, EventArgs e)

{

    this.vScrollBar1.LargeChange = 100;

    this.vScrollBar1.Maximum = 1000;

    this.vScrollBar1.SmallChange = 1;

    this.vScrollBar1.Value = 1000;

}

 実行直後は確かにLabelに1000という値が表示されるが、スクロールバーをマウスでクリックした瞬間に901となり、マウス操作ではそれ以上大きな値に変化させることができない。

感想 §

 直感的に分かりにくいにも関わらず、これは割と使いやすい仕様だったりします。Valueプロパティに移動不可能な値が代入できてしまう問題を除けば。