web-dev-qa-db-fra.com

Ajouter une barre de défilement verticale au panneau

J'essaie de faire défiler un Panel, mais uniquement verticalement (donc AutoScroll ne fonctionnera pas car les contrôles enfants vont au-delà du bord gauche et doivent le faire).

Alors, comment cela se fait-il?

37
Seth Carnegie

En supposant que vous utilisiez winforms, les composants de panneau par défaut ne vous offrent pas un moyen de désactiver les composants de défilement horizontal. Une solution de contournement consiste à désactiver le défilement automatique et à ajouter une barre de défilement vous-même:

ScrollBar vScrollBar1 = new VScrollBar();
vScrollBar1.Dock = DockStyle.Right;
vScrollBar1.Scroll += (sender, e) => { panel1.VerticalScroll.Value = vScrollBar1.Value; };
panel1.Controls.Add(vScrollBar1);

Discussion détaillée ici .

28
Teoman Soygul

Essayez ceci à la place pour le défilement vertical "seulement".
(le défilement automatique doit être faux pour accepter les modifications)

mypanel.AutoScroll = false;
mypanel.HorizontalScroll.Enabled = false;
mypanel.HorizontalScroll.Visible = false;
mypanel.HorizontalScroll.Maximum = 0;
mypanel.AutoScroll = true;
32
kamgman

Panel a une propriété AutoScroll. Définissez cette propriété sur True et le panneau ajoutera automatiquement une barre de défilement si nécessaire.

6
123iamking

Vous trouverez ci-dessous le code qui implémente une barre de défilement verticale personnalisée. Le détail important ici est de savoir quand la barre de défilement est nécessaire en calculant la quantité d’espace utilisé par les contrôles que vous ajoutez au panneau.

panelUserInput.SuspendLayout();
panelUserInput.Controls.Clear();
panelUserInput.AutoScroll = false;
panelUserInput.VerticalScroll.Visible = false;

// here you'd be adding controls

int x = 20, y = 20, height = 0;
for (int inx = 0; inx < numControls; inx++ )
{
    // this example uses textbox control
    TextBox txt = new TextBox();
    txt.Location = new System.Drawing.Point(x, y);
    // add whatever details you need for this control
    // before adding it to the panel
    panelUserInput.Controls.Add(txt);
    height = y + txt.Height;
    y += 25;
}
if (height > panelUserInput.Height)
{
    VScrollBar bar = new VScrollBar();
    bar.Dock = DockStyle.Right;
    bar.Scroll += (sender, e) => { panelUserInput.VerticalScroll.Value =  bar.Value; };
    bar.Top = 0;
    bar.Left = panelUserInput.Width - bar.Width;
    bar.Height = panelUserInput.Height;
    bar.Visible = true;
    panelUserInput.Controls.Add(bar);
}
panelUserInput.ResumeLayout();

// then update the form
this.PerformLayout();
3
glinatser

AutoScroll est vraiment la solution! Il vous suffit de définir AutoScrollMargin sur 0, 1000 ou quelque chose comme ça, utilisez-le pour faire défiler l'écran et ajouter des boutons et des éléments!

0
OldMember