web-dev-qa-db-de.com

So programmieren Sie ein Panel programmgesteuert

Ich habe einen System.Windows.Forms.Panel mit etwas Inhalt.

Ich versuche, das Bedienfeld programmgesteuert (vertikal) nach oben oder unten zu scrollen.

Ich habe versucht, die AutoScrollPosition-Eigenschaft im Panel auf eine neue Point zu setzen, aber das scheint es nicht zu tun.

Ich habe die AutoScroll-Eigenschaft auf true gesetzt.

Ich habe sogar versucht, den VerticalScroll.Value zweimal wie vorgeschlagen here einzustellen, aber das scheint auch nicht zu funktionieren.

Das mache ich gerade:

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

Die X- und Y-Werte von AutoScrollPosition bleiben 0 und 0.

Jede Hilfe oder Anleitung dazu wäre sehr dankbar.

Danke im Voraus,

Marwan

Hier ist eine Lösung. Ich schätze, Sie können Ihre Panel mit Win32 um eine beliebige Position scrollen. Es gibt jedoch einen einfachen Trick, um Ihre Anforderungen hier zu erfüllen:

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);

Oder verwenden Sie die Erweiterungsmethode:

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();

AKTUALISIEREN

Wenn Sie die genaue Position festlegen möchten, kann es hilfreich sein, den obigen Code ein wenig zu ändern:

//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++);
}

Eine andere Lösung, die Sie möglicherweise verwenden möchten, ist Panel.VerticalScroll.Value. Ich denke jedoch, dass Sie mehr Forschung benötigen, damit es wie erwartet funktioniert. Da ich einmal die Value-Änderung sehen kann, synchronisieren sich die Bildlaufleistenposition und die Steuerungsposition nicht gut. Beachten Sie, dass Panel.VerticalScroll.Value zwischen Panel.VerticalScroll.Minimum und Panel.VerticalScroll.Maximum liegen sollte.

13
King King

Versuche dies:- panel.ScrollControlIntoView (childcontrol);

Das sollte funktionieren. childcontrol ist das Steuerelement, das Sie in Ihrem Anzeigebereich anzeigen möchten.

3
Sagnik Majumder

Wenn Sie über eine Klasse verfügen, die von Panel abgeleitet ist, rufen Sie diese beiden geschützten Methoden auf, um durch das Bedienfeld zu scrollen:

// 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);

In meinem Beispiel ist item.BoundingRect.Bottom die Y-Koordinate der Unterseite einer Miniaturansicht, und ich muss das Bedienfeld nach unten scrollen, damit die gesamte Miniaturansicht sichtbar ist.

Die Lösung von König King, eine temporäre Steuerung zu erstellen, die nur das Scrollen ermöglicht, erschien mir "schwer". Und @ Hans Passants Vorschlag, AutoScrollMinSize und AutoScrollPosition einzustellen, hat für mich nicht funktioniert.

Übernehmen Sie für AutoScroll den Standardwert 'true'.

2
Ron

Das funktioniert überraschend! Beachten Sie das Minuszeichen im Code. Es gibt ein seltsames Verhalten beim Einstellen der Bildlaufposition. Wenn Sie die Position auf den genauen Wert (50) setzen, wird sie beim nächsten Lesen (-50) negativ. Sie müssen ihn daher invertieren, bevor Sie einen neuen Bildlaufwert einstellen. 

Runterscrollen:

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

Ähnlich aufwärts scrollen (-current.Y - 10)

1
Milan Švec

Verwenden Sie @King King Answered Code. Wenn Sie die horizontale und vertikale Bildlaufleiste ausblenden möchten, wenden Sie den folgenden Code im Konstruktor oder in der Initialisierung an.

        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

Ich hatte ein Problem, bei dem ich mein Panel nicht nach oben scrollen konnte. Ich habe viele Dinge ausprobiert, um zu versuchen, das Panel nach oben zu scrollen, nachdem es mit vielen Steuerelementen gefüllt wurde. 

Nomatter, was ich getan habe, stellte die VScroll-Leiste immer nach unten.

Nach ausführlichen Tests fand ich heraus, dass die Eigenschaft TabStop für meine Steuerelemente auf true festgelegt war (Standardeinstellung bei Benutzersteuerelementen). 

Wenn Sie TabStop auf false setzen, wurde das Problem behoben.

Erstellen Sie ein Steuerelement, das sich etwas außerhalb des sichtbaren Bereichs befindet (also -1 oben und clientsize + 1), und rufen Sie dann ScrollControlIntoView auf:

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();
}

with yourpanel.SetAutoScrollMargin (1, 1); Sie können sehr feine Bildlaufschritte einstellen und dann einen Timer verwenden, um den Bildlauf aufzurufen, wenn die Tasten gedrückt sind

0
Marc