2010-12-14 4 views
1

J'ai un formulaire avec un panneau déroulant et deux contrôles assis les uns sur les autres - un visible pas. En fonction d'une certaine condition lorsque ce formulaire est activé, je peux échanger les propriétés visibles des deux contrôles. Ces commandes sont situées en bas du panneau déroulant. Si quand je quitte ce formulaire je le laisse défiler vers le bas, allez changer la condition qui va changer la visibilité des contrôles et revenir à cette forme le contrôle visible aura baissé d'environ 200px sur la page laissant un grand écart. Quelqu'un sait ce qui pourrait causer cela? J'ai essayé de réinitialiser la position de la barre de défilement vers le haut à la fermeture du formulaire, mais cela entraîne juste un plus petit écart et parfois le contrôle pour passer plus haut dans d'autres contrôles. Des idées?L'emplacement de la barre de défilement est en mouvement visible/non visible changement de commandes

+1

plz ajouter Image, de sorte qu'il sera facile à comprendre. –

Répondre

0

Pas de repro. Il me semble que vous faites plus que simplement changer la propriété Visible. Chaque fois que vous affectez la propriété Location, vous devez ajouter AutoScrollPosition pour compenser l'état de défilement. Code postal si cela ne vous aide pas.

+0

Eh bien, c'est vraiment la seule chose que je fais. Si je commente le code pour désactiver la visibilité sur un contrôle et l'activer sur un autre et les laisser tous les deux visibles - ils restent tous deux au même endroit et ne bougent jamais peu importe où je quitte la position de défilement des formulaires. Je vais jouer avec AutoScrollPosition et voir si je ne peux pas obtenir quelque chose à travailler. En outre, l'emplacement est défini dans les propriétés des contrôles et non par programmation. – novacara

+0

Je vais marquer cela comme la meilleure réponse car elle m'a conduit sur le bon chemin. Je devais mettre panel.AutoScrollPosition à (0,0) chaque fois que je quittais le formulaire, car cela ne se produisait que lorsque le formulaire était quitté lorsque défilait vers le bas. Je pense que je l'avais essayé une fois auparavant mais que je mettais AutoScrollPosition sur le formulaire et non sur le panneau, donc bien sûr ça ne marchait pas. Je ne suis toujours pas sûr de ce qui se passe, car ça marche bien de toute façon si je ne suis pas en train de jouer avec la visibilité mais ... eh bien! – novacara

1

Voici un exemple qui reproduit le problème. Si la souris est déplacée au-dessus de l'étiquette rouge, la visibilité de button2 est changée en vrai ce qui provoque le retour des sauts de défilement à Button1.

public class Form123456 : Form { 

    public Form123456() { 
     Controls.Add(new UC1()); 
    } 

    public class UC1 : UserControl { 
     Button b1 = new Button { Text = "Button1" }; 
     Label lb = new Label { Text = "_", AutoSize = true, BackColor = Color.Red }; 
     Button b2 = new Button { Text = "Button2", Visible = false }; 
     Button b2b = new Button { Text = "x" }; 
     Button b3 = new Button { Text = "Button3" }; 
     public UC1() { 
      AutoScroll = true; 
      Dock = DockStyle.Fill; 
      b1.Location = new Point(0, 200); 
      b2.Location = new Point(0, 600); 
      lb.Location = new Point(70, 600); 
      b2b.Location = new Point(90, 600); 
      b3.Location = new Point(0, 800); 
      Controls.Add(b1); 
      Controls.Add(b2); 
      Controls.Add(lb); 
      Controls.Add(b2b); 
      Controls.Add(b3); 

      lb.MouseEnter += delegate { 
       b2.Visible = true; 
      }; 
      lb.MouseLeave += delegate { 
       b2.Visible = false; 
      }; 
     } 
    } 
} 

Pour résoudre ce problème, une solution consiste à ajouter ce code:

protected override Point ScrollToControl(Control activeControl) { 
     return this.AutoScrollPosition; 
    } 

Solution de: Why does clicking in a text box cause an AutoScroll panel to scroll back to the top?

0

Avez-vous vérifié l'ordre que vous changez la visibilité des deux contrôles? Les barres de défilement d'un conteneur dont le défilement automatique est défini sur Vrai s'affichent et disparaissent en fonction de la position des commandes situées en dehors de la zone visible du contrôle. Les contrôles invisibles ne comptent pas. Ainsi, dans votre cas, si les deux contrôles sont invisibles à tout moment, les barres de défilement disparaissent. Ils reviendront lorsqu'un contrôle sera visible. Donc, pour vous assurer que vous n'avez pas un saut dans la position de la barre de défilement et la position des contrôles, vous devez vous assurer qu'à aucun moment les deux contrôles ne sont invisibles. Une autre solution consiste à avoir un contrôle pseudo-visible sur le conteneur. C'est un contrôle dont la visibilité est définie sur true mais qui n'est pas visible pour l'utilisateur (par exemple un point de la couleur de l'arrière-plan, une étiquette sans texte ...). Placez ce contrôle dans la position la plus éloignée x, y et les barres de défilement ne disparaîtront jamais ..

Questions connexes