VB.NET: TreeView.AfterSelect focus/select na TextBox

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.

Reklama

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á.