Поделиться через


Позиция прокрутки не поддерживается в элементе управления "Панель с автоматической прокруткой" в приложении Windows Forms

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

Исходная версия продукта: 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));

Пример приложения

Чтобы использовать это обходное решение в примере приложения, выполните следующие действия.

  1. Нажмите кнопку "Пуск", наведите указатель на программы, наведите указатель на Microsoft Visual Studio .NET и выберите Microsoft Visual Studio .NET или Microsoft Visual Studio 2005.

  2. В меню Файл выберите пункт Создать и затем пункт Проект. Откроется диалоговое окно Создание проекта .

  3. В разделе "Типы проектов" щелкните " Проекты Visual Basic" или выберите "Проекты Visual C#".

    Замечание

    В Visual Studio 2005 щелкните Visual C#.

  4. В разделе "Шаблоны" щелкните "Приложение Windows".

  5. В поле "Имя" введите SampleWinApp и нажмите кнопку "ОК". По умолчанию создается форма с именем Form1.

  6. Добавьте элемент управления Button и элемент управления Panel в форму Form1.

    Замечание

    Не вставляйте элемент управления Button в элемент управления "Панель".

  7. Щелкните правой кнопкой мыши элемент управления "Панель " и выберите пункт "Свойства".

  8. Задайте для свойства Auto-Scroll значение True.

  9. Перед инструкцией класса 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));
    }
    
  10. В меню Отладка выберите команду Начать.

  11. В форме Form1 нажимайте Button1 несколько раз, чтобы полоса прокрутки отображалась в элементе управления Panel.

    Замечание

    Позиция прокрутки сохраняется в элементе управления "Панель".

Ссылки

Определение свойства ScrollableControl.AutoScrollPosition