我有一个C#.NET 3.0项目,它使用包含多行控件的TableLayoutPanel。如果我向下滚动以使顶部项目不再可见,则删除一列中的控件并将其替换为新控件,TableLayoutPanel将滚动回到顶部。
/// 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();
}
我需要做些什么才能防止滚动位置发生变化?
答案 0 :(得分:2)
您正在删除具有焦点的控件。它将尝试找到另一个焦点,如有必要,将其滚动到视图中。除了给予另一个控件焦点之外,可能有用的一件事是添加TextBox并在删除标签之前为其提供焦点。
答案 1 :(得分:0)
Hans Passant的解决方案最适合上下文。但在其他无法使用焦点的情况下,您可以使用AutoScollPosition
滚动回到之前的位置:
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