专注于一个小组。使用带垂直滚动的面板。 [英] Focus a panel. Working with panel with vertical scroll.
问题描述
大家好,
如何聚焦位于父控件尺寸以下的面板。父AutoScroll设置为true。见下图。
控件
pnlControlList 面板
- 参见 ImageBox02 。这在表单加载时隐藏。仅在单击向下箭头时显示。项目也是面板。
picControlListView PictureBox
要显示 pnlControlList
请看这张图片。 [ ^ ]
ImageBox01 这是运行程序时显示的内容。默认选择的项目是 项目表格
。
ImageBox02 当您点击向下箭头右上角,将显示所有项目。
ImageBox03 这就是我想要发生的事情。我只需手动滚动显示
项目表
。
注意
这与组合框控件相同。
项目创建
Dim pnl As 新面板
pnl.Padding = 新填充( 3 , 2 , 0 , 0 )
pnl.Height = 18
pnl.Tag = node
AddHandler pnl.Click, AddressOf ControlList_Click
AddHandler pnl.MouseEnter,< span class =code-keyword> AddressOf ControlList_MouseEnter
pnlControlList.Controls.Add(pnl)
Dim lbl2 作为 新标签
lbl2.Text = < span class =code-string>& 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)
< span class =code-keyword> Dim lbl1 作为 新标签
lbl1.Text = fieldName
lbl1.AutoSize = True
lbl1.Dock = DockStyle.Left
lbl1.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)
某些控件的处理程序
#RegionDROPDOWN LIST
私有 Sub picControlListView_Click(发件人 As 对象,e 作为 EventArgs)句柄 picControlListView.Click
If pnlControlList.Visible 然后
pnlControlList.Visible = False
其他
pnlControlList.Width = TreeView1.Width
pnlControlList.Visible = True
对于 < span class =code-keyword>每个 c 作为控制在 pnlControlList.Controls
如果 c.Controls.Count> 0 然后
c.Width = pnlControlList.Width - ( 2 + IIf(pnlControlList.VerticalScroll.Maximum = 100 , 0 ,< span class =code-digit> 23 ))
结束 如果
下一步
txtControlListFocus.Focus()
结束 如果
结束 Sub
私有 Sub pnlControlListView_Click(发件人 As 对象,e As EventArgs)句柄 pnlControlL istView.Click
picControlListView_Click(sender,e)
End Sub
私有 Sub lblControlListName_Click(发件人 As 对象,e 作为 EventArgs)句柄 lblControlListName.Click
picControlListView_Click(sender,e)
End Sub
私有 Sub lblControlListType_Click(发件人正如 对象,e As EventArgs)句柄 lblControlListType.Click
picControlListView_Click(sender,e)
结束 Sub
私人 Sub txtControlListFocus_LostFocus(sender As Object ,e As EventArgs)句柄 txtControlListFocus.LostFocus
pnlControlList.Visible = False
结束 Sub
#End Region
我尝试过:
这是我在google中找到的。
我试过 pnlControlList.ScrollControlIntoView(childPanel)
但是而不是面板获得焦点,父控件在孩子上方放置一个巨大的边距/空白区域。
请看这个我mage。 [ ^ ]
我在重现你的问题时遇到了问题所以我已经把一个有效的测试项目放在了一起。您可以在此处下载并试用: WinformScrollIntoViewPanel.zip - Google云端硬盘 [ ^ ]
为了进一步测试,我在可滚动面板中放置了一个可滚动的面板,并在测试表单中添加了按钮,将主面板元素和子面板元素滚动到视图中。一切都按预期工作。以下是滚动到视图中的测试代码:
私有 Sub ButtonClicked(发件人作为 对象,e 作为 EventArgs)_
Handles 但是GroupBox1.Click,但是PictBox1.Click,但是ListBox1.Click,
butComboBox1.Click,但是PictBox2。单击,但是ListBox2.Click,
butGroupBox2.Click,但是ComboBox2.Click
Dim mainPanelCtrl 作为 Control = Nothing
Dim subPanelCtrl 作为 Control = Nothing
选择 案例 True
' - 主要控制台 -
案例发件人是但是GroupBox1
mainPanelCtrl = GroupBox1
案例 sender butListBox1
mainPanelCtrl = ListBox1
案例 sender 是但是ComboBox1
mainPanelCtrl = ComboBox1
案例 sender < span class =code-keyword>是但是PictureBox1
mainPanelCtrl = PictureBox1
' - 主要控制台的子面板 -
案例发件人是但是GroupBox2
mainPanelCtrl = Pa nel2 ' 滚动子面板
subPanelCtrl = GroupBox2 ' 然后控件
案例发件人是 butListBox2
mainPanelCtrl = Panel2
subPanelCtrl = ListBox2
案例 sender 但是ComboBox2
mainPanelCtrl = Panel2
subPanelCtrl = ComboBox2
案例发件人是但是PICTureBox2
mainPanelCtrl = Panel2
subPanelCtrl = PictureBox2
结束 选择
如果 mainPanelCtrl IsNot Nothing 然后
Panel1.ScrollControlIntoView(mainPanelCtrl)
结束 如果
如果 subPanelCtrl IsNot Nothing 然后
Panel2.ScrollControlIntoView(subPanelCtrl)
结束 如果
结束 Sub
需要注意的是,内部子面板需要小于主面板的视口。如果不是,子面板中的元素将不会滚动到视图中。原因是ScrollIntoView(...)方法仅将上坐标滚动到视图中。如果子面板对于视口来说太大,则子面板中的某些元素可能看起来不会滚动到视图中,因为元素的顶部(或左侧)位于主面板视口之外,但位于子面板视口内。
Hello everyone,
How can I focus a panel that is located way below the parent control size. The parent AutoScroll is set to true. See below image.
Controls
pnlControlList Panel
- See ImageBox02. This is hidden when form loaded. Shown only when down arrow is click. Items are also panel.
picControlListView PictureBox
To diplay the pnlControlList
Please see this image.[^]
ImageBox01 That is the displayed when you run the program. The default selected item is Item Table
.
ImageBox02 When you clicked the down arrow top right, all items will be shown.
ImageBox03 This is what I want to happen. I just manually scroll to display the
Item Table
.
Note
This is same as a combobox control.
Items Creation
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)
Handlers of some controls
#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
What I have tried:
This is what I found in google.
I tried pnlControlList.ScrollControlIntoView(childPanel)
but instead of panel getting focus the parent control puts a huge margin/white space above the childs.
Please see this image.[^]
I'm having problems reproducing your problem so I have put together a test project that works. You can download and try it here: WinformScrollIntoViewPanel.zip - Google Drive[^]
To test this further, I've put a scrollable Panel inside a scrollable Panel and added buttons to the test form to scroll main Panel elements and sub Panel elements into view. Everything works as expected. Here is the test code for scrolling into view:
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
Something to note, the inner sub Panels will need to be smaller than the viewport of the main Panel. If not, elements in the sub Panel will not scroll into view. The reason for this is that the ScrollIntoView(...) method only scrolls the upper coordinates into view. if the sub Panel is too large for the Viewport, some elements in the sub Panel may appear to not scroll into view as the top (or left) of the element is outside the main Panel viewport but within the sub Panel viewport.
这篇关于专注于一个小组。使用带垂直滚动的面板。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!