web-dev-qa-db-ja.com

プログラムでパネルをスクロールする方法

System.Windows.Forms.Panelにコンテンツがあります。

プログラムでパネルを(垂直に)上下にスクロールしようとしています。

パネルでAutoScrollPositionプロパティを新しいPointに設定しようとしましたが、それができないようです。

AutoScrollプロパティをtrueに設定しています。

提案されたようにVerticalScroll.Valueを2回設定しようとさえしました ここ ですが、それでもうまくいかないようです。

これは私が現在していることです:

//I have tried passing both positive and negative values.
panel.AutoScrollPosition = new Point(5, 10);

AutoScrollPositionのXとYの値は0と0のままです。

これに関するヘルプや指示は大歓迎です。

前もって感謝します、

マーワン

14

これが解決策です。 Win32を使用してPanelを任意の位置までスクロールできると思いますが、ここで要件を達成するための簡単なトリックがあります。

public void ScrollToBottom(Panel p){
  using (Control c = new Control() { Parent = p, Dock = DockStyle.Bottom })
     {
        p.ScrollControlIntoView(c);
        c.Parent = null;
     }
}
//use the code
ScrollToBottom(yourPanel);

または、便宜上拡張メソッドを使用します。

public static class PanelExtension {
   public static void ScrollToBottom(this Panel p){
      using (Control c = new Control() { Parent = p, Dock = DockStyle.Bottom })
      {
         p.ScrollControlIntoView(c);
         c.Parent = null;
      }
   }
}
//Use the code
yourPanel.ScrollToBottom();

更新

正確な位置を設定したい場合は、上記のコードを少し修正すると役立ちます。

//This can help you control the scrollbar with scrolling up and down.
//The position is a little special.
//Position for scrolling up should be negative.
//Position for scrolling down should be positive
public static class PanelExtension {
    public static void ScrollDown(this Panel p, int pos)
    {
        //pos passed in should be positive
        using (Control c = new Control() { Parent = p, Height = 1, Top = p.ClientSize.Height + pos })
        {
            p.ScrollControlIntoView(c);                
        }
    }
    public static void ScrollUp(this Panel p, int pos)
    {
        //pos passed in should be negative
        using (Control c = new Control() { Parent = p, Height = 1, Top = pos})
        {
            p.ScrollControlIntoView(c);                
        }
    }
}
//use the code, suppose you have 2 buttons, up and down to control the scrollbar instead of clicking directly on the scrollbar arrows.
int i = 0;
private void buttonUp_Click(object sender, EventArgs e)
{
   if (i >= 0) i = -1;
   yourPanel.ScrollUp(i--);
}
private void buttonDown_Click(object sender, EventArgs e)
{
   if (i < 0) i = 0;
   yourPanel.ScrollDown(i++);
}

使用する別の解決策は、Panel.VerticalScroll.Valueの使用です。ただし、期待どおりに機能させるには、さらに研究が必要だと思います。 Valueを一度変更すると表示されるため、スクロールバーの位置とコントロールの位置がうまく同期しません。 Panel.VerticalScroll.ValuePanel.VerticalScroll.MinimumPanel.VerticalScroll.Maximumの間にある必要があることに注意してください。

15
King King

Panelから派生するクラスがある場合は、次の2つの保護されたメソッドを呼び出してパネルをスクロールします。

// The bottom is off screen; scroll down. These coordinates must be negative or zero.
SetDisplayRectLocation(0, AutoScrollPosition.Y - item.BoundingRect.Bottom + ClientRectangle.Bottom);
AdjustFormScrollbars(true);

私の例では、item.BoundingRect.Bottomはサムネイルの下部のY座標であり、サムネイル全体が表示されるようにパネルを下にスクロールする必要があります。

スクロールができるように一時的なコントロールを作成する@King Kingのソリューションは、私にとって「重い」ように思えました。 @Hans PassantによるAutoScrollMinSizeAutoScrollPositionの設定の提案は、私にとってはうまくいきませんでした。

AutoScrollをデフォルト値の「true」のままにします。

4
Ron

これを試してください:-panel.ScrollControlIntoView(childcontrol);

これは動作するはずです。 childcontrolは、表示領域に表示する特定のコントロールです。

4
Sagnik Majumder

これは驚くほどうまくいきます!コード内のマイナス記号に注意してください。スクロール位置の設定には奇妙な動作があります。位置を正確な値(50)に設定すると、次回読むときにマイナス(-50)になります。したがって、新しいスクロール値を設定する前にそれを反転する必要があります。

下へスクロール:

private void ButtonScrollDown_OnClick(object sender, EventArgs e)
{
    Point current = yourScrollPanel.AutoScrollPosition;
    Point scrolled = new Point(current.X, -current.Y + 10);
    yourScrollPanel.AutoScrollPosition = scrolled;
}

同様に上にスクロールします(-current.Y-10)

2
Milan Švec

@King King Answered Codeを使用し、水平および垂直スクロールバーを非表示にする場合は、コンストラクターまたは初期化で次のコードを適用します。

        yourPanel.AutoScroll = false;
        yourPanel.HorizontalScroll.Maximum = 0;
        yourPanel.HorizontalScroll.Visible = false;
        yourPanel.VerticalScroll.Maximum = 0;
        yourPanel.VerticalScroll.Visible = false;
        yourPanel.AutoScroll = true;
1
suneel ranga

パネルをトップにスクロールできない問題がありました。パネルに多くのコントロールを配置した後、パネルを一番上にスクロールして戻そうと、多くのことを試しました。

私がやったことには関係なく、常にVScrollバーを一番下に配置します。

徹底的なテストの結果、コントロールのTabStopプロパティがtrue(ユーザーコントロールのデフォルト)に設定されていたことが問題の原因であることがわかりました。

TabStopをfalseに設定すると修正されました。

可視領域のわずかに外側にあるコントロールを作成し(そのため、上部が-1でclientsize + 1)、ScrollControlIntoViewを呼び出します。

public static class PanelExtension {
public static void ScrollDown(this Panel p)
{

    using (Control c = new Control() { Parent = p, Height = 1, Top = p.ClientSize.Height + 1 })
    {
        p.ScrollControlIntoView(c);                
    }
}
public static void ScrollUp(this Panel p )
{

    using (Control c = new Control() { Parent = p, Height = 1, Top = -1})
    {
        p.ScrollControlIntoView(c);                
    }
}
}
    //use the code, suppose you have 2 buttons, up and down to control the scrollbar instead of clicking directly on the scrollbar arrows.

        private void buttonUp_Click(object sender, EventArgs e)
{

   yourPanel.ScrollUp();
}
private void buttonDown_Click(object sender, EventArgs e)
{

   yourPanel.ScrollDown();
}

yourpanel.SetAutoScrollMargin(1、1);非常に細かいスクロール手順を設定し、ボタンを押したときにタイマーを使ってスクロールを呼び出すことができます

0
Marc