TreeView („stromový pohled“ zní odporně) je užitečný, pokud potřebujete zobrazit údaje jež mají nějakou hierarchii/strukturu. Manipulace s uzly je zpočátku trochu nepřehledná, ale po chvíli si člověk zvykne. Při práci s TreeView (dále používám jen TV) jsem našel drobný nedostatek, po výběru položky v TV nechtěl program pochopit pokus o Focus/Select na TextBox a neúprosně se vracel na TV, vyřešeno malým workaroundem.
TV si po prokliku, nebo jinak provedeném výběru, vezme Focus zpět, bez ohledu na to, že jste jej programově předali jinam, v mém případě na TextBox v jiném panelu s parametrem TabIndex = 1. Vzhledem k tomu, že jsem se s tímto chováním setkal jen na platformě .NET, považuji jej za chybu. Když chci psát do předvoleného TextBoxu psát, první stisk klávesy je chápán jako pokračování výběru; vybrána je položka v rozbalené větvi začínající písmenem, jež jsem stiskl, nebo dalším.
Napřed zdrojový kód:
Private Sub TreeView1_AfterSelect(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterSelect
Dim objNode As TreeNode
objNode = TreeView1.SelectedNode
Select Case objNode.GetType.ToString
Case "AMzdy.WorkerTreeNode"
Dim objWorkerTreeNode As AMzdy.WorkerTreeNode
objWorkerTreeNode = CType(objNode, WorkerTreeNode)
If (SaveExecute() = True) Then
PracLoad(CInt(objWorkerTreeNode.WorkerType.PracID))
Else
MsgBox("Byly ponechán původní pracovník")
End If
For Each pomTab As System.Windows.Forms.TabPage In Me.AktPr.TabPages
For Each ctl As Control In pomTab.Controls
If ((TypeOf ctl Is TextBox) And (ctl.TabIndex = 1)) Then
pomTab.Select()
ctl.Select()
TreeView1.GetContainerControl()
Exit For
End If
Next
Next
TreeViev1_GotFocus(TreeView1, New System.EventArgs)
Case "CustomTreeView.SubdivisionTreeNode"
'
Case "StatPrislNode"
End Select
End Sub
Private Sub TreeView1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TreeView1.Click
Dim tn As TreeNode = TreeView1.GetNodeAt(TreeView1.PointToClient(Cursor.Position))
If Not (tn Is Nothing) Then
If tn Is TreeView1.SelectedNode Then
TreeView1_AfterSelect(TreeView1, New System.Windows.Forms.TreeViewEventArgs(TreeView1.SelectedNode))
Else
TreeView1.SelectedNode = tn
End If
End If
End Sub
Private Sub TreeViev1_GotFocus(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TreeView1.GotFocus
SendKeys.Send("{TAB}")
End Sub
Finta je ve volání procedury TreeView1_GotFocus(), která programově stiskne tabulátor (klávesa „Tab“). Doprovázeno systémovým zvonkem, ale funguje jak jsem potřeboval. Workaround by měl fungovat pro Focus/Select na libovolný Control v GUI.
BTW: VisualBasic.NET nemá, snad kromě názvu, nic společného s historickým BASICem, přesto se určitě najdou kritické hlasy, že slušný programátor takový jazyk nepoužije. Ano i já se řadím mezi vývojáře pracující s tímto jazykem a chvíli mi trvalo, než jsem si přivykl na jeho „ukecanost“, která je i proti Javě opravdu šílená.