Остановить прокрутку tablelayoutpanel

У меня есть проект 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();
}

Что мне нужно сделать, чтобы положение прокрутки не изменилось?


person PaulH    schedule 24.08.2010    source источник


Ответы (2)


Вы удаляете элемент управления, имеющий фокус. Он попытается найти другой объект, на который можно будет сфокусироваться, при необходимости прокручивая его в поле зрения. Не говоря уже о передаче фокуса другому элементу управления, одна вещь, которая может сработать, - это добавить TextBox и дать ему фокус перед удалением метки.

person Hans Passant    schedule 24.08.2010

Решение Ганса Пассанта лучше всего подходит для данного контекста. Но в других случаях, когда вы не можете работать с фокусом, вы можете использовать _ 1_, чтобы вернуться к предыдущей позиции:

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
person Breeze    schedule 06.04.2016