2010-02-04 6 views
15

Salut j'ai un tablelayoutpanel et je lie des contrôles dynamiquement. Lorsque le nombre d'éléments dépasse la hauteur du panneau, il est évident que la barre de défilement verticale n'apparaît pas.Comment désactiver la barre de défilement horizontale pour le panneau de table dans Winforms

Mais la même barre de défilement horizontal apparaît même si la largeur des éléments est inférieure à la largeur du panneau. Comment puis-je empêcher cela?

+0

Je me rends compte que c'est 4 ans, cependant, j'ai juste eu le même problème (ou très similaire aujourd'hui, et le correctif était aussi simple que 'AutoScroll = false' J'espère que ça aide quelqu'un! – Cullub

+3

@cullub 'AutoScroll = false' désactivera également la barre de défilement verticale, mais la question est de savoir comment désactiver uniquement la barre de défilement Horizonatal – Nikita

Répondre

1

Est-ce que le problème est que vos éléments sont exactement la largeur du panneau de disposition, de sorte que lorsque le défilement verticulaires apparaît, il coupe un peu vos commandes, forçant le défilement horizontal? Si tel est le cas, vous pouvez réduire la largeur de vos contrôles pour tenir compte de la possibilité de faire défiler la barre de défilement, ou vous pouvez essayer de les ajuster lorsque la barre de défilement apparaît.

1

J'ai rencontré ce problème.

Beaucoup de gens ont également le même problème dans Datagrid. Mais, il n'y a pas de solution exacte pour cette question, vous devrez décider manuellement la dimension du panneau en fonction de l'utilisation. Cela désactivera la barre de défilement horizontale, mais vous devrez ajuster manuellement la dimension du panneau de disposition de la table.

Une autre manière pourrait être de calculer la largeur possible de tablelayoutpanel pendant l'exécution et si elle est supérieure à la valeur que vous avez définie alors vous pouvez l'activer.

tableLayoutPanel1.HorizontalScroll.Enabled = true; 
+1

Ne fonctionne pas La barre de défilement horizontale apparaît comme avant La propriété alternative 'Visible' ne fonctionne pas non plus – ygoe

32
int vertScrollWidth = SystemInformation.VerticalScrollBarWidth; 

tableLayoutPanel1.Padding = new Padding(0, 0, vertScrollWidth, 0); 
+3

cela fonctionne vraiment! merci! –

+1

Drôle de solution Est-ce que tu sais par hasard pourquoi cette sorcellerie fonctionne? –

+1

Testé sur .NET 4.6.2 Il supprime la barre de défilement h quand la hauteur ne suffit pas, mais le problème est qu'il fait une large marge sur la droite qui ne disparaît pas lorsque la barre de défilement en V apparaît.Je veux que le TableLayoutPanel La largeur de la fenêtre. –

6

perdu quelques poils sur cette question aujourd'hui, mais je l'ai résolu et voici ce que j'ai fini avec:

  1. Créer une nouvelle classe qui hérite de TableLayoutPanel (permet de l'appeler MyTableLayoutPanel) et passer outre la propriété MaximumSize comme ceci:

    public override Size MaximumSize 
    { 
        get 
        { 
         if (Parent != null) 
          return new Size(Parent.Width, 0); 
         else 
          return base.MaximumSize; 
        } 
        set 
        { 
         base.MaximumSize = value; 
        } 
    } 
    

    Vous pouvez bien sûr rendre plus ge but final en ajoutant une autre propriété qui décide si vous devez ou non renvoyer le MaximumSize modifié ou non, mais j'espère que cela est évident pour quiconque lit ceci.

  2. Modifiez le TableLayoutPanel que vous avez dans le nouveau type MyTableLayoutPanel.

  3. Ajoutez-le à un panneau standard. Activer AutoScroll sur ce panneau au lieu de MyTableLayoutPanel (le désactiver si vous ne l'avez pas déjà fait).

  4. Définissez la propriété MyTableLayoutPanel AutoSize sur true et sa propriété Anchor sur Left, Right et Top.

+0

C'est la seule solution qui a vraiment fonctionné pour ma mise en page, merci! –

2

J'ai eu ce problème avec un TableLayoutPanel ancré contenant des GroupBox ancrés et un seul Column défini sur 100% de largeur. Je ne voulais pas définir une taille manuelle pour ceux-ci - je voulais qu'ils redimensionnent avec le formulaire. Étrangement, en réglant le remplissage droit du TableLayoutPanel à 1 (pas la largeur de la barre de défilement - qui a laissé un espace de la taille d'une barre de défilement, comme vous vous y attendiez) résolu complètement le problème. C'est dans C# 2010 Express, .NET 4, Windows 8. Aucune idée si ce kludge fonctionne sur d'autres variations.

La définition du remplissage à 0 semblait pour résoudre le problème dans l'IDE, mais le problème existait toujours lors de l'exécution.

Ça sent comme une sorte de bug dans le TableLayoutPanel pour moi ... ou peut-être c'est juste la combinaison particulière de contrôles et de propriétés que j'ai (c'est une mise en page assez compliquée).

+1

confirmé pour .NET 3.5, Windows 7 – miasbeck

1

Cela a parfaitement fonctionné dans .NET 3.5 où les autres solutions ne me donne pas exactement ce que je voulais:

if (this.TableLayoutPanel1.HorizontalScroll.Visible) 
    { 
    int newWid = this.TableLayoutPanel1.Width - 
        (2 * SystemInformation.VerticalScrollBarWidth); 
    //this.TableLayoutPanel1.Padding = new Padding(0, 0, newWid, 0); 
    foreach (Control ctl in this.TableLayoutPanel1.Controls) 
    { 
     ctl.Width = newWid; 
    } 
    } 
0

Je résolu ce problème en utilisant un simple panneau dans lequel je le TableLayoutPanel s'épingler. Ensuite, j'ai fait pas le TLP ont les barres de défilement, mais le Panel. Cela fonctionne bien pour moi.

Je suppose que le TLP avec les différentes colonnes et lignes a des problèmes pour calculer la largeur de chacun et montre ainsi une barre de défilement verticale même si ce n'est pas nécessaire.

Questions connexes