2010-12-20 18 views
3

Excelの「無限の」スクロール可能性に似た何かを実装しようとしています。ユーザがドキュメントの「ボトム」までスクロールできること、スクロールバーをスクロールバーまたはスクロールバーのいずれかを使用してスクロールしたままにすると、空の行がさらに生成されます。私はこれが主に働いています(マウススクロールホイールを使用すると完全に動作します)。私はSmallIncrement機能に問題があります。つまり、ユーザーがスクロールバーの下向きの矢印をクリックすると、スクロールバーのスクロール可能な範囲の下部にあるにもかかわらず、scrollbar.SmallChangeによって下に移動する必要があります。ScrollBarの値が正しく設定されていません

ここ

は(scrollBar_Scrollのハンドラで)私のコードです:

int difference = e.NewValue - e.OldValue; 
if (e.Type == ScrollEventType.SmallIncrement) 
{ 
    if (difference != scrollBar.SmallChange) 
    { 
     int increase = (scrollBar.SmallChange - difference); 
     scrollBar.Maximum += increase; 
     scrollBar.Value += increase; 
    } 
} 

は、デバッガでそれを見ると、これは私が期待するとおりに値を設定します。しかし、関数が終了した後に何か(何が確実でないか)が発生し、scrollBar.Valueが元の値に1を加えた値に戻されます。私が下向きの矢印を押し続けると、ほとんどの場合正しく動作します。ボタンが離されるとまだ少し上にジャンプします。

これを引き起こしている可能性があり、それを修正する方法はありますか?

乾杯!

編集:ここにスクロールホイールコードがあります。それはとても似ているので、なぜそれが動作していないのか混乱しています。これは収納パネルのMouseWheelイベントハンドラにあります。

int desiredValue = scrollBar.Value - e.Delta; 
scrollBar.MaximumValue = (Math.Max(normalBottom, desiredValue + scrollBar.LargeChange)); 
scrollBar.Value = Math.Max(0, desiredValue); 

normalBottomスクロールバーのエンディング「有限」を覚える変数である - Excelでは、これは最低のユーザーが入力したデータ、または、画面の高さのどちらかだろう。したがって、通常はこの値を超えてスクロールします(負にならないでください)。

+0

なぜこの比較を使用していますか:if(difference!= scrollBar.SmallChange)?どのような目的のために? –

+0

違い!= SmallChangeの場合は、スクロール可能な範囲の下側をヒットする必要があります。 – Smashery

答えて

5

スクロールバーで発生していることは、ユーザーがスクロールバーを操作してイベントを引き起こし、イベントハンドラが呼び出されたときにプロパティ値が更新されていない場合、イベントハンドラが返すとプロパティが内部で設定されます。スクロールバーはあなたが設定した値を上書きし、 "ジャンプバック"効果を引き起こします。どのような価値を設定する必要があるのか​​、どのように覚えていますか?簡単です:e.NewValueにあります。そして、それは次のように正確な方法スクロールイベント中に、このプロパティの最終的な値を変更することがちょうどe.NewValueに書き込むことができるように、正確にあなたのソリューションです:

int difference = e.NewValue - e.OldValue; 
     if (e.Type == ScrollEventType.SmallIncrement) 
     { 
      if (difference != scrollBar.SmallChange) 
      { 
       int increase = (scrollBar.SmallChange - difference); 
       scrollBar.Maximum += increase; 
       e.NewValue = scrollBar.Value + increase; 
      } 
     } 

私が関連する可能性があるtheeseページをリンクしたいです(あなたはまだそれが唯一の1進める取得さえする最大の移動理由です)を発言で がhttp://msdn.microsoft.com/en-us/library/system.windows.forms.scrollbar.maximum.aspx

注:あなたに

最大値は、プログラムによってのみ到達することができます。スクロールバーの値は、実行時にユーザー操作を介して最大値に到達することはできません。ユーザーの操作によって到達できる最大値は、「1」に「Maximum」プロパティー値から「LargeChange」プロパティー値を引いた値を足した値になります。必要な場合は、オブジェクトのサイズに最大プロパティを設定することができます-1 1.

http://msdn.microsoft.com/en-us/library/system.windows.forms.scrollbar.scroll.aspx http://msdn.microsoft.com/en-us/library/system.windows.forms.scrolleventargs.newvalue.aspx の用語を説明するために(スクロールバーの新しい値を取得または設定します。[強調でセット]]

+0

ありがとうございました!これは問題を完全に解決しました! – Smashery