SftTree/DLL 7.5 - Tree Control
SftBox/OCX 5.0 - Combo Box Control
SftButton/OCX 3.0 - Button Control
SftMask/OCX 7.0 - Masked Edit Control
SftTabs/OCX 6.5 - Tab Control (VB6 only)
SftTree/OCX 7.5 - Tree Control
SftPrintPreview/DLL 2.0 - Print Preview Control (discontinued)
SftTree/DLL 7.5 - Tree Control
SftBox/OCX 5.0 - Combo Box Control
SftButton/OCX 3.0 - Button Control
SftDirectory 3.5 - File/Folder Control (discontinued)
SftMask/OCX 7.0 - Masked Edit Control
SftOptions 1.0 - Registry/INI Control (discontinued)
SftPrintPreview/OCX 1.0 - Print Preview Control (discontinued)
SftTabs/OCX 6.5 - Tab Control (VB6 only)
SftTree/OCX 7.5 - Tree Control
SftTabs/NET 6.0 - Tab Control (discontinued)
SftTree/NET 2.0 - Tree Control
This sample shows dynamic loading ("load as you go") of the tree control.
The source code is located at C:\Program Files (x86)\Softelvdm\SftTree NET 2.0\Samples\VB\ExploreAssembly.
Imports System.Reflection
Imports Softelvdm.Controls
Imports Softelvdm.SftTreeNET
Public Class Form1
Private Const bFlags As BindingFlags = BindingFlags.FlattenHierarchy Or BindingFlags.Instance Or BindingFlags.NonPublic Or BindingFlags.Public Or BindingFlags.Static
Private Sub CloseButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CloseButton.Click
    Close()
End Sub
Private Sub LoadButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LoadButton.Click
    openFileDialog1.ShowDialog()
End Sub
Private Sub openFileDialog1_FileOk(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles openFileDialog1.FileOk
    LoadAssembly(openFileDialog1.FileName)
End Sub
Private Sub LoadAssembly(ByVal asm As Assembly)
    sftTree1.Initializing = True
    Dim itemCollection As ItemCollectionClass = sftTree1.ItemCollection
    itemCollection.Clear()
    ListInfo(itemCollection, asm)
    itemCollection.Sort()
    sftTree1.Headers(0, 0).Text = asm.FullName
    sftTree1.Columns.MakeOptimal(0, True)
    sftTree1.RecalcHorizontalExtent()
    sftTree1.Initializing = False
End Sub
Private Sub LoadAssembly(ByVal newInputFile As String)
    Dim asm As Assembly = Nothing
    Try
        asm = Assembly.LoadFrom(newInputFile)
    Catch e As Exception
        MessageBox.Show(e.Message)
        Return
    End Try
    LoadAssembly(asm)
End Sub
Private Sub ListInfo(ByVal itemCollection As ItemCollectionClass, ByVal a As Assembly)
    Dim item As ItemClass = itemCollection.Add("Custom Attributes")
    item.TagObjects = a.GetCustomAttributes(True)
    If item.TagObjects.Length > 0 Then
        item.ExpandCollapseButton = ExpandCollapseButtonStyleEnum.Show
    Else
        item.ExpandCollapseButton = ExpandCollapseButtonStyleEnum.Hide
    End If
    item = itemCollection.Add("Exported Types")
    item.TagObjects = a.GetExportedTypes()
    If item.TagObjects.Length > 0 Then
        item.ExpandCollapseButton = ExpandCollapseButtonStyleEnum.Show
    Else
        item.ExpandCollapseButton = ExpandCollapseButtonStyleEnum.Hide
    End If
    item = itemCollection.Add("Files")
    item.TagObjects = a.GetFiles()
    If item.TagObjects.Length > 0 Then
        item.ExpandCollapseButton = ExpandCollapseButtonStyleEnum.Show
    Else
        item.ExpandCollapseButton = ExpandCollapseButtonStyleEnum.Hide
    End If
    item = itemCollection.Add("Manifest Resource Names ")
    item.TagObjects = a.GetManifestResourceNames()
    If item.TagObjects.Length > 0 Then
        item.ExpandCollapseButton = ExpandCollapseButtonStyleEnum.Show
    Else
        item.ExpandCollapseButton = ExpandCollapseButtonStyleEnum.Hide
    End If
    item = itemCollection.Add("Properties")
    Dim props() As PropertyInfo = a.GetType().GetProperties(bFlags)
    For Each p As PropertyInfo In props
        Dim sval As String = ""
        Try
            Dim val As Object = p.GetValue(a, Nothing)
            If Not val Is Nothing Then
                sval = val.ToString()
            Else
                sval = "(null)"
            End If
        Catch
            sval = "(?)"
        End Try
        item.Add(New String() {p.Name, sval})
    Next
    item.Children.Sort()
End Sub
Private Sub ListInfo(ByVal itemCollection As ItemCollectionClass, ByVal o As Object)
    Dim tp As Type = o.GetType()
    Dim item As ItemClass = itemCollection.Add("Custom Attributes")
    item.TagObjects = tp.GetCustomAttributes(True)
    item.ExpandCollapseButton = ExpandCollapseButtonStyleEnum.Show
    item = itemCollection.Add("Events")
    item.TagObjects = tp.GetEvents(bFlags)
    If item.TagObjects.Length > 0 Then
        item.ExpandCollapseButton = ExpandCollapseButtonStyleEnum.Show
    Else
        item.ExpandCollapseButton = ExpandCollapseButtonStyleEnum.Hide
    End If
    item = itemCollection.Add("Fields")
    item.TagObjects = tp.GetFields(bFlags)
    If item.TagObjects.Length > 0 Then
        item.ExpandCollapseButton = ExpandCollapseButtonStyleEnum.Show
    Else
        item.ExpandCollapseButton = ExpandCollapseButtonStyleEnum.Hide
    End If
    item = itemCollection.Add("Interfaces")
    item.TagObjects = tp.GetInterfaces()
    If item.TagObjects.Length > 0 Then
        item.ExpandCollapseButton = ExpandCollapseButtonStyleEnum.Show
    Else
        item.ExpandCollapseButton = ExpandCollapseButtonStyleEnum.Hide
    End If
    item = itemCollection.Add("Members")
    item.TagObjects = tp.GetMembers(bFlags)
    If item.TagObjects.Length > 0 Then
        item.ExpandCollapseButton = ExpandCollapseButtonStyleEnum.Show
    Else
        item.ExpandCollapseButton = ExpandCollapseButtonStyleEnum.Hide
    End If
    item = itemCollection.Add("Methods")
    item.TagObjects = tp.GetMethods(bFlags)
    If item.TagObjects.Length > 0 Then
        item.ExpandCollapseButton = ExpandCollapseButtonStyleEnum.Show
    Else
        item.ExpandCollapseButton = ExpandCollapseButtonStyleEnum.Hide
    End If
    item = itemCollection.Add("Nested Types")
    item.TagObjects = tp.GetNestedTypes(bFlags)
    If item.TagObjects.Length > 0 Then
        item.ExpandCollapseButton = ExpandCollapseButtonStyleEnum.Show
    Else
        item.ExpandCollapseButton = ExpandCollapseButtonStyleEnum.Hide
    End If
    item = itemCollection.Add("Properties")
    Dim props() As PropertyInfo = tp.GetProperties(bFlags)
    For Each p As PropertyInfo In props
        Dim sval As String = ""
        Try
            Dim val As Object = p.GetValue(o, Nothing)
            If Not val Is Nothing Then
                sval = val.ToString()
            Else
                sval = "(null)"
            End If
        Catch
            sval = "(?)"
        End Try
        item.Add(New String() {p.Name, sval})
    Next
    item.Children.Sort()
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    sftTree1.Columns.Count = 2
    sftTree1.Headers.Reorderable = sftTree1.Footers.Reorderable = False
    sftTree1.Headers.MergeWithNextDefault = True
    sftTree1.Headers.AllowMergeFromPreviousDefault = True
    sftTree1.Columns(0).MergeWithNextDefault = True
    sftTree1.Columns(1).AllowMergeFromPreviousDefault = True
    sftTree1.MergeStyle = MergeStyleEnum.EmptyCells
    sftTree1.AutoRespond = False
    sftTree1.RowHeaders.Width = 0
    LoadAssembly(Assembly.GetExecutingAssembly())
End Sub
Private Sub ExpandCollapseItem(ByVal item As ItemClass)
    If item.Expanded Then
        item.Collapse(CollapseStyleEnum.SaveCurrent)
    Else
        If (item.HasChildren) Then
            item.Expand(ExpandStyleEnum.RestoreLast)
        Else
            sftTree1.Initializing = True
            If item.TagString = "Single" Then
                item._CreateChildren = True
                ListInfo(item.Children, item.TagObject)
            Else
                For Each o As Object In item.TagObjects
                    Dim newItem As ItemClass = item.Add(o.ToString())
                    newItem.TagObject = o
                    newItem.ExpandCollapseButton = ExpandCollapseButtonStyleEnum.Show
                    newItem.TagString = "Single"
                Next
            End If
            If (item.HasChildren) Then
                item.Children.Sort()
            End If
            item.ExpandCollapseButton = ExpandCollapseButtonStyleEnum.Conditional
            item.Expand(ExpandStyleEnum.DirectOnly)
            sftTree1.Initializing = False
        End If
    End If
    sftTree1.Columns.MakeOptimal(0, True)
    sftTree1.RecalcHorizontalExtent()
End Sub
Private Sub sftTree1_ItemClick(ByVal sender As Object, ByVal e As Softelvdm.SftTreeNET.ItemClickEventArgs) Handles sftTree1.ItemClick
    Debug.Write("ItemClick ")
    DumpValues(e)
    ' user clicks expand/collapse button
    If e.Area = ItemClickAreaEnum.ExpandCollapseButton And Not e.Item Is Nothing Then
        ExpandCollapseItem(e.Item)
    End If
End Sub
Private Sub sftTree1_ItemDoubleClick(ByVal sender As Object, ByVal e As Softelvdm.SftTreeNET.ItemClickEventArgs) Handles sftTree1.ItemDoubleClick
    Debug.Write("ItemDoubleClick ")
    DumpValues(e)
    ' user double clicks on an item
    If e.Area = ItemClickAreaEnum.CellSel And Not e.Item Is Nothing Then
        ExpandCollapseItem(e.Item)
    End If
End Sub
Private Sub sftTree1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles sftTree1.KeyDown
    If e.KeyCode = Keys.Right Then
        ' Right arrow normally expands a parent item. Our items don't (yet) have
        ' child items, so we'll have to handle the right arrow keys.
        Dim item As ItemClass = sftTree1.FocusItem
        If Not item Is Nothing Then
            If item.ExpandCollapseButton = ExpandCollapseButtonStyleEnum.Show Then
                ExpandCollapseItem(item)
                e.Handled = True
            End If
        End If
    End If
End Sub
' This is a small helper routine to show all properties and fields of an object
Private Sub DumpValues(ByVal o As Object)
    Dim api() As PropertyInfo = o.GetType().GetProperties()
    For Each pi As PropertyInfo In api
        Dim s As String
        On Error Resume Next
        pi.GetValue(o, New Object() )
        Debug.Write(" " & pi.Name & " " & s)
    Next
    Dim afi() As FieldInfo = o.GetType().GetFields()
    For Each fi As FieldInfo In afi
        Dim t As Object = fi.GetValue(o)
        Dim s As String = "(null)"
        If Not t Is Nothing Then s = t.ToString()
        Debug.Write(" " & fi.Name & " " & s)
    Next
    Debug.WriteLine("")
End Sub
End Class