56 votes

Ajouter une barre de défilement verticale au panneau

J'essaie de faire un Panel défilement, mais uniquement verticalement (donc AutoScroll ne fonctionnera pas car les contrôles enfants dépassent le bord gauche et doivent).

Comment cela se passe-t-il ?

0 votes

Vous voulez donc n'avoir que le défilement vertical lorsque c'est nécessaire ? En réglant le paramètre Scrollbars à la propriété Vertical ne fonctionne pas ?

0 votes

@debracey Il n'y a pas de propriété appelée Scrollbars sur mon Panel et il n'apparaît pas dans Intellisense. J'ai vu d'autres personnes en parler, donc je pense que cela existe, mais je m'y prends mal. J'obtiens cette erreur pour cette ligne : panel1.Scrollbars = ScrollBars.Vertical; - 'System.Windows.Forms.Panel' does not contain a definition for 'Scrollbars' and no extension method 'Scrollbars' accepting a first argument of type 'System.Windows.Forms.Panel' could be found (are you missing a using directive or an assembly reference?)

0 votes

@debracey J'utilise VS 2010 Pro.

54voto

kamgman Points 614

Essayez plutôt ceci pour un défilement vertical "uniquement".
(le défilement automatique doit être désactivé pour que les modifications soient acceptées)

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

2 votes

Très bon point pour avoir soulevé le fait que AutoScroll doit être fixé à false, merci.

35voto

Teoman Soygul Points 17544

En supposant que vous utilisiez winforms, les composants du panneau par défaut ne vous offrent pas la possibilité de désactiver les composants à 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 aquí .

0 votes

Je n'ai vraiment pas envie de faire ce "hack". Comment puis-je le faire manuellement avec un VScrollBar composant ?

0 votes

@Teoman cet exemple ne m'aide pas, je peux le faire avec le concepteur de formulaires. Quelle est la formule pour déterminer les valeurs max/min de la barre de défilement, comment puis-je décaler les contrôles à l'intérieur du panneau lorsque la barre de défilement se déroule vers le bas, etc.

0 votes

Il suffit de synchroniser VerticalScroll.Value avec les propriétés Scroll événement. Mise à jour du code. Notez que pour obtenir l'effet de défilement, il doit y avoir des éléments qui débordent du bord inférieur du panneau (c'est-à-dire qu'il doit y avoir des éléments non visibles vers lesquels défiler).

6voto

OldMember Points 39

AutoScroll est vraiment la solution ! Il vous suffit de paramétrer AutoScrollMargin à 0, 1000 ou quelque chose comme ça, puis l'utiliser pour faire défiler vers le bas et ajouter des boutons et des éléments à cet endroit !

1 votes

Veuillez contextualiser davantage votre réponse, montrer un exemple de code, etc.

5voto

123iamking Points 690

Panel dispose d'un AutoScroll propriété. Il suffit de donner à cette propriété la valeur True et le panneau ajoutera automatiquement une barre de défilement si nécessaire.

7 votes

L'OP a spécifiquement mentionné que AutoScroll n'est pas une solution

3voto

glinatser Points 31

Vous trouverez ci-dessous le code qui met en œuvre la 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 l'espace consommé 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();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X