I am trying to migrate a project designed with Xaml to Vb.net project with windows form application. I am using TreeNode class in windows form application while System.Windows.Controllar is TreeView in Xaml project. So I am getting an error in my code below, here is how best to fix the error. The line where I get the error is: "AddHandler treeViewItem.Expanded, AddressOf tvi_Expanded" where "Expression does not produce a value." I get an error
Private Function AddDirectoryNode(parentItemCollection As TreeNode, directoryDetail As DirectoryDetail) As Boolean
Dim treeViewItem As TreeNode
treeViewItem = New TreeNode()
treeViewItem.Tag = directoryDetail
AddHandler treeViewItem.Expand, AddressOf tvi_Expanded
'If this Then directory contains subdirectories, add a placeholder
If (directoryDetail.SubDirectoryDetails.Count() > 0) Then
treeViewItem.Nodes.Add(New TreeNode() With {.Name = "placeholder"})
End If
' Add the treeview item into the items collection
parentItemCollection.Nodes.Add(treeViewItem)
Return True
End Function``
Sub tvi_Expanded(sender As Object, e As EventArgs)
Me.ExpandNode(CType(sender, TreeNode))
End Sub
Private Sub ExpandNode(tvi As TreeNode)
If (tvi.Nodes.Count = 1 And CType(tvi.Nodes(0), TreeNode).Name = "placeholder") Then
tvi.Nodes.Clear()
For Each directoryDetail As DirectoryDetail In (CType(tvi.Tag, DirectoryDetail).SubDirectoryDetails.OrderBy(Function(x) x.Path))
Me.AddDirectoryNode(tvi.Nodes.Add(directoryDetail.Path), directoryDetail)
Next directoryDetail
End If
End Sub
Below is the original version;
Private Sub ExpandNode(tvi As System.Windows.Controls.TreeViewItem)
If (tvi.Items.Count = 1 And CType(tvi.Items(0), System.Windows.Controls.TreeViewItem).Name = "placeholder") Then
tvi.Items.Clear()
For Each directoryDetail As DirectoryDetail In (CType(tvi.Tag, DirectoryDetail).SubDirectoryDetails.OrderBy(Function(x) x.Path))
Me.AddDirectoryNode(tvi.Items, directoryDetail)
Next directoryDetail
End If
End Sub
Private Function AddDirectoryNode(parentItemCollection As System.Windows.Controls.ItemCollection, directoryDetail As DirectoryDetail) As Boolean
Dim treeViewItem As System.Windows.Controls.TreeViewItem
Dim stackPanel As System.Windows.Controls.StackPanel
' Create the stackpanel and it's content
stackPanel = New System.Windows.Controls.StackPanel()
stackPanel.Orientation = System.Windows.Controls.Orientation.Horizontal
' Content
stackPanel.Children.Add(Me.CreateProgressBar("Cumulative percentage from total used space {0}% ({1}))", directoryDetail.CumulativeSizePercentage, directoryDetail.FormattedCumulativeBytes))
stackPanel.Children.Add(New System.Windows.Controls.TextBlock() With {.Text = directoryDetail.DirectoryName})
' Create the treeview item
treeViewItem = New System.Windows.Controls.TreeViewItem()
treeViewItem.Tag = directoryDetail
treeViewItem.Header = stackPanel
AddHandler treeViewItem.Expanded, AddressOf tvi_Expanded
' If this directory contains subdirectories, add a placeholder
If (directoryDetail.SubDirectoryDetails.Count() > 0) Then
treeViewItem.Items.Add(New System.Windows.Controls.TreeViewItem() With {.Name = "placeholder"})
End If
' Add the treeview item into the items collection
parentItemCollection.Add(treeViewItem)
Return True
End Function
Sub tvi_Expanded(sender As Object, e As System.Windows.RoutedEventArgs)
System.Windows.Input.Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait
Me.ExpandNode(CType(sender, System.Windows.Controls.TreeViewItem))
System.Windows.Input.Mouse.OverrideCursor = Nothing
End Sub
CodePudding user response:
The TreeView control does not have one event matching Expanded
. It has events for BeforeExpand
and AfterExpand
. It sounds like you want AfterExpand
.
The arguments (types) that are sent to your handler tvi_Expanded
will probably not match, so you need to change your handler sub and your event binder.
Example:
Private Function AddDirectoryNode()
'... change the binding for your event handler
AddHandler treeViewItem.AfterExpand, AddressOf tvi_Expanded
'... etc
End Function
Private Sub tvi_Expanded(sender As Object, e As TreeViewEventArgs) '
Me.ExpandNode(e.Node) 'e.Node is the expanded TreeNode
End Sub
For more info, check the MS docs for TreeView.AfterExpand event https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.treeview.afterexpand?view=windowsdesktop-7.0 and the TreeViewEventArgs obj https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.treevieweventargs.node?view=windowsdesktop-7.0
CodePudding user response:
I'm very close to the end. I have a little mistake, but I couldn't fix it. Where am I doing wrong? https://ibb.co/bXn0QYR not working stable. It shows 1 subdirectory after a space and when I click on the other empty directory I get an error.
Private Sub ExpandNode(tvi As TreeNode)
If (tvi.Nodes.Count = 1 And CType(tvi.Nodes(0), TreeNode).Name = "placeholder") Then
tvi.Nodes.Clear()
For Each directoryDetail As DirectoryDetail In (CType(tvi.Tag, DirectoryDetail).SubDirectoryDetails.OrderBy(Function(x) x.Path))
Me.AddDirectoryNode(tvi.Nodes.Add(directoryDetail.Path), directoryDetail)
Next directoryDetail
End If
End Sub
Private Function AddDirectoryNode(parentItemCollection As TreeNode, directoryDetail As DirectoryDetail) As Boolean
Dim treeViewItem As TreeNode
treeViewItem = New TreeNode()
treeViewItem.Tag = directoryDetail
If (directoryDetail.SubDirectoryDetails.Count() > 0) Then
treeViewItem.Nodes.Add(New TreeNode() With {.Name = "placeholder"})
End If
parentItemCollection.Nodes.Add(treeViewItem)
Return True
End Function
Private Sub tvi_Expanded(sender As Object, e As TreeViewEventArgs) '
Me.ExpandNode(e.Node) 'e.Node is the expanded TreeNode
End Sub
Private Sub DirectoryTree_BeforeExpand(sender As Object, e As TreeViewCancelEventArgs) Handles DirectoryTree.BeforeExpand
Dim treeViewItem As TreeNode
treeViewItem = New TreeNode()
treeViewItem.Tag = e.Node
Me.ExpandNode(e.Node)
If (e.Node.Nodes.Count() > 0) Then
treeViewItem.Nodes.Add(New TreeNode() With {.Name = "placeholder"})
End If
e.Node.Nodes.Add(treeViewItem)
End Sub