hansoctantan Ответов: 1

Фокус группы. Работа с панелью с вертикальной прокруткой.


Всем привет,

Как я могу сфокусировать панель, расположенную намного ниже размера родительского элемента управления? Родительская Автопрокрутка имеет значение true. См. изображение ниже.

Управления
pnlControlList Panel - Видеть ImageBox02. Это скрыто При загрузке формы. Показывается только тогда, когда стрелка вниз это щелчок. Элементы также являются панельными.
picControlListView PictureBox Чтобы diplay the pnlControlList

Пожалуйста, посмотрите на это изображение.[^]

ImageBox01 Это отображается при запуске программы. Выбранный по умолчанию элемент Item Table.
ImageBox02 Когда вы нажали кнопку стрелка вниз в правом верхнем углу будут показаны все элементы.
ImageBox03 Именно этого я и хочу. Я просто вручную прокручиваю, чтобы отобразить
Item Table.

Примечание
Это то же самое, что и элемент управления combobox.

Создание Элементов
Dim pnl As New Panel
pnl.Padding = New Padding(3, 2, 0, 0)
pnl.Height = 18
pnl.Tag = node
AddHandler pnl.Click, AddressOf ControlList_Click
AddHandler pnl.MouseEnter, AddressOf ControlList_MouseEnter
pnlControlList.Controls.Add(pnl)

Dim lbl2 As New Label
lbl2.Text = "  " & controlStr
lbl2.AutoSize = True
lbl2.Dock = DockStyle.Left
lbl2.Tag = fieldName & "_" & controlStr
AddHandler lbl2.Click, AddressOf ControlList_Click
AddHandler lbl2.MouseEnter, AddressOf ControlList_MouseEnter
pnl.Controls.Add(lbl2)

Dim lbl1 As New Label
lbl1.Text = fieldName
lbl1.AutoSize = True
lbl1.Dock = DockStyle.Left
lbl1.Font = New Font(lblControlListName.Font.FontFamily, lblControlListName.Font.Size, FontStyle.Bold)
lbl1.Tag = fieldName & "_" & controlStr
AddHandler lbl1.Click, AddressOf ControlList_Click
AddHandler lbl1.MouseEnter, AddressOf ControlList_MouseEnter
pnl.Controls.Add(lbl1)
Обработчики некоторых элементов управления
#Region "DROPDOWN LIST"
    Private Sub picControlListView_Click(sender As Object, e As EventArgs) Handles picControlListView.Click
        If pnlControlList.Visible Then
            pnlControlList.Visible = False
        Else
            pnlControlList.Width = TreeView1.Width
            pnlControlList.Visible = True
            For Each c As Control In pnlControlList.Controls
                If c.Controls.Count > 0 Then
                    c.Width = pnlControlList.Width - (2 + IIf(pnlControlList.VerticalScroll.Maximum = 100, 0, 23))
                End If
            Next
            txtControlListFocus.Focus()
        End If
    End Sub

    Private Sub pnlControlListView_Click(sender As Object, e As EventArgs) Handles pnlControlListView.Click
        picControlListView_Click(sender, e)
    End Sub

    Private Sub lblControlListName_Click(sender As Object, e As EventArgs) Handles lblControlListName.Click
        picControlListView_Click(sender, e)
    End Sub

    Private Sub lblControlListType_Click(sender As Object, e As EventArgs) Handles lblControlListType.Click
        picControlListView_Click(sender, e)
    End Sub

    Private Sub txtControlListFocus_LostFocus(sender As Object, e As EventArgs) Handles txtControlListFocus.LostFocus
        pnlControlList.Visible = False
    End Sub
#End Region


Что я уже пробовал:

Вот что я нашел в google.
Я пытался pnlControlList.ScrollControlIntoView(childPanel) но вместо того, чтобы панель фокусировалась, родительский элемент управления помещает огромное поле / пустое пространство над ребенком.

Пожалуйста, посмотрите на это изображение.[^]

Graeme_Grant

Изображение и описание не дают достаточной информации. Кроме того, мы не можем видеть ваш код отсюда...

Nelek

Код был добавлен

1 Ответов

Рейтинг:
4

Graeme_Grant

У меня возникли проблемы с воспроизведением вашей проблемы, поэтому я собрал тестовый проект, который работает. Вы можете скачать и попробовать его здесь: WinformScrollIntoViewPanel.zip -Google Диск[^]

Чтобы проверить это дальше, я поместил прокручиваемую панель внутри прокручиваемой панели и добавил кнопки в тестовую форму для прокрутки элементов основной панели и элементов подпанели в поле зрения. Все работает, как и ожидалось. Вот тестовый код для прокрутки в поле зрения:

Private Sub ButtonClicked(sender As Object, e As EventArgs) _
    Handles butGroupBox1.Click, butPictureBox1.Click, butListBox1.Click,
    butComboBox1.Click, butPictureBox2.Click, butListBox2.Click,
    butGroupBox2.Click, butComboBox2.Click

    Dim mainPanelCtrl As Control = Nothing
    Dim subPanelCtrl As Control = Nothing

    Select Case True

        ' -- MAIN PANEL CONTROLS --

        Case sender Is butGroupBox1
            mainPanelCtrl = GroupBox1

        Case sender Is butListBox1
            mainPanelCtrl = ListBox1

        Case sender Is butComboBox1
            mainPanelCtrl = ComboBox1

        Case sender Is butPictureBox1
            mainPanelCtrl = PictureBox1

        '-- SUB PANEL OF MAIN PANEL CONTROLS --

        Case sender Is butGroupBox2
            mainPanelCtrl = Panel2      ' scroll the sub-panel
            subPanelCtrl = GroupBox2    ' then the control

        Case sender Is butListBox2
            mainPanelCtrl = Panel2
            subPanelCtrl = ListBox2

        Case sender Is butComboBox2
            mainPanelCtrl = Panel2
            subPanelCtrl = ComboBox2

        Case sender Is butPictureBox2
            mainPanelCtrl = Panel2
            subPanelCtrl = PictureBox2

    End Select

    If mainPanelCtrl IsNot Nothing Then
        Panel1.ScrollControlIntoView(mainPanelCtrl)
    End If

    If subPanelCtrl IsNot Nothing Then
        Panel2.ScrollControlIntoView(subPanelCtrl)
    End If

End Sub

Следует отметить, что внутренние субпанели должны быть меньше, чем видовое окно главной панели. Если нет, то элементы на под-панели не будут прокручиваться в поле зрения. Причина этого заключается в том, что метод ScrollIntoView(...) прокручивает только верхние координаты в поле зрения. если субпанель слишком велика для видового экрана, некоторые элементы субпанели могут не прокручиваться в поле зрения, так как верхняя (или левая) часть элемента находится вне видового экрана главной панели, но внутри видового экрана субпанели.


hansoctantan

я фактически проигнорировал эту функцию в своем проекте-автоматическую прокрутку. большое вам спасибо за ваш ответ. не говоря уже о образце исходного кода, это действительно помогает. Я понял, в чем проблема. когда я использую панель.ScrollControlIntoView (control), панель не видна. Я думаю, что это портит дизайн.

Graeme_Grant

Да, есть много факторов, чтобы заставить его работать. Если это сложно, пришло время пересмотреть и упростить.

Я рад, что вы нашли альтернативное решение.