2009-04-16 19 views
4

UserControlから継承するクラス内にVerticalScroll.Valueを設定するはずのC#コードのチャンクがあります。クラスの子オブジェクトのサイズが変更されたときに呼び出されます。クラスのAutoScrollプロパティがtrueに設定されています。C#UserControl.VerticalScroll.Valueが設定されていません

public void ScrollTo(int top) 
    { 
     if (top >= this.VerticalScroll.Minimum && top <= this.VerticalScroll.Maximum) 
     { 
      this.VerticalScroll.Value = top; 
     } 
    } 

問題は、時にはそれは、このメソッドが呼び出される前に、それが持っていた値を保持し、時にはthis.VerticalScroll.Valueが設定されます、コードをトレースするとき、です。

これはVSのバグですか、それとも値を設定しようとしても無視される既知の条件はありますか?

おかげで、 ロブ

答えて

19

私は同じ問題を抱えて、いくつかのdevのフォーラム内の溶液に出くわしました。 VerticalScroll.Valueを設定したら、PerformLayout()を呼び出してスクロールコントロールを更新する必要があります。これはこうです:

scrollingcontrol.VerticalScroll.Value = top; 
scrollingcontrol.PerformLayout(); 

これは同じ効果があるようですが、これは.Valueを2回設定するよりも意味があります。

+1

ああ、私の答えは、受け入れられた答えより「良い」ですが、愛はありませんか? – stone

+1

私はそれをアップ票するためにそれをテストしなければならないでしょう。プロジェクトは5月に完了して以来、私は自由な瞬間を得るまで待たなければなりません。 –

+2

skypecakesの答えは正しいです。私は今日もまったく同じ問題を抱えていて、PerformLayout()を呼び出して解決しました。ありがとう。 –

3

は、私は同じ問題に実行していた、と私は(私は新しいユーザーだ「原因、私はリンクを投稿させません)MSDNのWebページ上の解決策を見つけました。

提案された解決策は、二回.Valueのに割り当てることだった、それが私の仕事:

int newVerticalScrollValue = 
     pDashboard.VerticalScroll.Value - pDashboard.VerticalScroll.SmallChange; 

pDashboard.VerticalScroll.Value = newVerticalScrollValue; 
pDashboard.VerticalScroll.Value = newVerticalScrollValue; 
+0

@Aowyn、ありがとう、私はちょうどこれをテストする機会があり、それは素晴らしい作品です。 –

0

FlowLayoutPanelは別の獣であるようです。スクロールバーは下に移動しますが、flowlayoutpanel.VerticalScroll.Valueの値は0のままです。上記のテクニックに加え、いくつかのDoEvents()とThread.Sleep()を試しました。それはすべて失敗した。私は最終的には、例えば、異なる値にVerticalScroll.Valueを設定し、関心の値にする必要があった私の場合は... DisplayRectangle.Yが瞬時にスクロール変化を表すたこと

private void PrintButton_Click(object sender, EventArgs e) 
{ 
    FlowLayoutPanel flp = TheBuildFlowLayoutPanel; 
    List<Bitmap> printPics = new List<Bitmap>(); 
    int printLastY = 100; 
    flp.VerticalScroll.Value = 0; 
    while (flp.DisplayRectangle.Y < printLastY) // DisplayRect.Y becomes successively more negative 
    { 
     Bitmap bmp = new Bitmap(flp.Width, flp.Bounds.Height); 
     printPics.Add(bmp); 
     flp.DrawToBitmap(bmp, flp.ClientRectangle); 
     printLastY = flp.DisplayRectangle.Y; 
     flp.VerticalScroll.Value = Math.Min(flp.VerticalScroll.Maximum, flp.VerticalScroll.Value + flp.Height); 
    } 

    flp.VerticalScroll.Value = 0; 
    for (int i = 0; i < printPics.Count; i++) 
    { 
     printPics[i].Save("C:\\Temp" + i.ToString() + ".bmp"); 
    } 
} 
+0

本当にいいと思うのは、FlowLayoutPanel.PrintまたはFlowLayoutPanel.DrawFullContentsToBitmapです。 – user922020

+0

したがって、上記のコードはFlowLayoutPanelの特殊なケースではVerticalScrollbar.Valueに関してトピックになっていますので、そのまま残しておきます。 印刷のためのはるかに簡単な解決策(ビットマップ、ループなし)は、FLPをドッキング解除し、そのサイズを(flp.Width、flp.VerticalScrollbar.Maxiumum)に設定し、それをビットマップに印刷することです。次にそれを通常のサイズに戻します。私は、FLPがコントロールをレイアウトしている作業面のサイズを教えてくれる適切なプロパティを見つけることができません。それは横向きにAutoScrollを使用し、VerticalScrollbar.Maximumを使用するようだ... – user922020

0

を発見しました

this.panel1.VerticalScroll.Value = verticalScrollPosition - 1; 
this.panel1.VerticalScroll.Value = verticalScrollPosition; 

スクロール位置が常にVerticalScroll.MinimumとVerticalScroll.Maximumの間にあるように注意してください。

関連する問題