2010-08-24 15 views
1

J'ai un projet C# .NET 3.0 qui utilise un TableLayoutPanel contenant plusieurs lignes de contrôles. Si je fais défiler vers le bas de sorte que l'élément supérieur n'est plus visible, puis supprimez un contrôle dans une colonne et remplacez-le par un nouveau contrôle, le TableLayoutPanel défile vers le haut.Arrêt d'un tablelayoutpanel à partir du défilement

/// the panel in question 
private System.Windows.Forms.TableLayoutPanel impl_; 

/// The user has clicked a linklabel in the panel. replace it with an edit-box 
private void OnClicked(object sender, LinkLabelLinkClickedEventArgs e) 
{ 
    LinkLabel link_label = sender as LinkLabel; 
    TextBox new_edit = new TextBox(); 
    // setup the new textbox... 

    TableLayoutPanelCellPosition pos = impl_.GetCellPosition(link_label); 
    impl_.Controls.Remove(link_label); 
    impl_.Controls.Add(new_edit, pos.Column, pos.Row); 
    new_edit.Focus(); 
} 

Que dois-je faire pour empêcher la position de défilement de changer?

Répondre

2

Vous supprimez le contrôle qui a le focus. Il essaiera d'en trouver un autre pour le mettre au point, le faisant défiler si nécessaire. Bref de donner un autre contrôle au focus, une chose qui pourrait fonctionner est d'ajouter le TextBox et de lui donner le focus avant que vous supprimez l'étiquette.

0

La solution de Hans Passant est la meilleure pour le contexte. Mais dans les autres cas où vous ne pouvez pas travailler avec le focus, vous pouvez utiliser le AutoScollPosition pour revenir à la position précédente:

Point scrollPosition = tlp.AutoScrollPosition; 

//make changes here 

tlp.AutoScrollPosition = new Point(-scrollPosition.X, -scrollPosition.Y) //according to the documentation negative coordinates are returned but positive ones need to be assigned