Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье предлагается способ обхода проблемы, которая возникает при очистке, а затем перерисовке прокручиваемой панели управления, содержащей дочерние элементы управления.
Исходная версия продукта: Visual Basic .NET
Исходный номер базы знаний: 829417
Симптомы
Если в приложении Microsoft Windows Forms вы очищаете, а затем перерисовываете автоматически прокручиваемый элемент управления "Панель", содержащий дочерние элементы управления, позиция прокрутки не сохраняется.
Причина
Иногда необходимо очистить содержимое элемента управления "Панель", а затем перерисовать его. Например, это необходимо сделать, если элемент управления "панель с автопрокруткой" содержит коллекцию элементов управления с определенным порядком. Как правило, эти элементы управления являются пользовательскими элементами управления.
Однако приложение не сохраняет значение свойства AutoScrollPosition элемента управления Panel. Таким образом, позиция прокрутки не сохраняется при перерисовке содержимого элемента управления "Панель".
Обходной путь
Чтобы обойти это поведение, используйте System.Drawing.Point структуру для хранения значения AutoScrollPosition свойства элемента управления Panel.
После перерисовки элемента управления Panel можно получить значение AutoScrollPosition свойства с помощью нового экземпляра структуры System.Drawing.Point.
Метод get свойства Panel.AutoScrollPosition.X и метод get свойства Panel.AutoScrollPosition.Y возвращают отрицательные значения. Однако требуются положительные значения. Вы можете использовать функцию Math.Abs для получения положительного значения из свойств Panel.AutoScrollPosition.X и Panel.AutoScrollPosition.Y, как показано в следующей строке кода:
Код Visual Basic .NET или Visual Basic 2005
Panel1.AutoScrollPosition = New Point(Math.Abs(Panel1.AutoScrollPosition.X), Math.Abs(CurrentPoint.Y))
Код Visual C# .NET Visual C# 2005
panel1.AutoScrollPosition = new Point(Math.Abs(panel1.AutoScrollPosition.X), Math.Abs(CurrentPoint.Y));
Пример приложения
Чтобы использовать это обходное решение в примере приложения, выполните следующие действия.
Нажмите кнопку "Пуск", наведите указатель на программы, наведите указатель на Microsoft Visual Studio .NET и выберите Microsoft Visual Studio .NET или Microsoft Visual Studio 2005.
В меню Файл выберите пункт Создать и затем пункт Проект. Откроется диалоговое окно Создание проекта .
В разделе "Типы проектов" щелкните " Проекты Visual Basic" или выберите "Проекты Visual C#".
Замечание
В Visual Studio 2005 щелкните Visual C#.
В разделе "Шаблоны" щелкните "Приложение Windows".
В поле "Имя" введите SampleWinApp и нажмите кнопку "ОК". По умолчанию создается форма с именем Form1.
Добавьте элемент управления Button и элемент управления Panel в форму Form1.
Замечание
Не вставляйте элемент управления Button в элемент управления "Панель".
Щелкните правой кнопкой мыши элемент управления "Панель " и выберите пункт "Свойства".
Задайте для свойства Auto-Scroll значение True.
Перед инструкцией класса
Endв файле Form1.vb добавьте следующий код:Код Visual Basic .NET или Visual Basic 2005
Private count As Integer Private arrayctl As New ArrayList Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim newtxt As New TextBox newtxt.Text = count count += 1 arrayctl.Add(newtxt) DrawControls() End Sub Private Sub DrawControls() Dim txt As TextBox Dim CurrentPoint As System.Drawing.Point CurrentPoint = Panel1.AutoScrollPosition() Dim i As Integer = 0 Panel1.Controls.Clear() Panel1.SuspendLayout() For Each txt In arrayctl Panel1.Controls.Add(txt) txt.Width = Panel1.ClientRectangle.Width txt.Top = i i += txt.Height Next Panel1.ResumeLayout() Panel1.AutoScrollPosition = New Point(Math.Abs(Panel1.AutoScrollPosition.X), Math.Abs(CurrentPoint.Y)) End SubКод Visual C# .NET или Visual C# 2005
private int count; private ArrayList arrayctl = new ArrayList(); private void button1_Click(object sender, System.EventArgs e) { TextBox newtxt = new TextBox(); newtxt.Text = count.ToString(); count++; arrayctl.Add(newtxt); DrawControls(); } private void DrawControls() { System.Drawing.Point CurrentPoint; CurrentPoint = panel1.AutoScrollPosition; int i = 0; panel1.Controls.Clear(); panel1.SuspendLayout(); foreach (TextBox txt in arrayctl) { panel1.Controls.Add(txt); txt.Width = panel1.ClientRectangle.Width; txt.Top = i; i += txt.Height; } panel1.ResumeLayout(); panel1.AutoScrollPosition = new Point(Math.Abs(panel1.AutoScrollPosition.X), Math.Abs(CurrentPoint.Y)); }В меню Отладка выберите команду Начать.
В форме Form1 нажимайте Button1 несколько раз, чтобы полоса прокрутки отображалась в элементе управления Panel.
Замечание
Позиция прокрутки сохраняется в элементе управления "Панель".