VB.Net Как обновить узел в TreeView NodeMouseClick - PullRequest
1 голос
/ 26 марта 2012

Я пытаюсь написать инструмент развертывания, используя TreeView. Я проследил несколько учебных пособий, которые нашел в Интернете, чтобы заполнить древовидную структуру папками / подпапками / и файлами. Это все работает, и моя функциональность для обработки моего развертывания файла, кажется, в порядке, но у меня проблема с отображением

Мой treeView правильно отображает структуру моей папки и файлы внутри каждой папки, даже прикрепляя правильное изображение значка к каждой папке / файлу.

Если я щелкну по +, чтобы развернуть или свернуть узел (папку), все по-прежнему в порядке, но если я выполню один щелчок по папке, появится событие _NodeMouseClick, запускающее и не обновляющее мое содержимое правильно. Любые подпапки больше не отображаются, а файлы теперь имеют значок папки. Если я сверну и снова разверну узел папки, все вернется так, как должно.

Вот соответствующий код:

Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    ' when our component is loaded, we initialize the TreeView by  adding  the root node
    Dim mRootNode As New TreeNode
    mRootNode.Text = RootPath
    mRootNode.Tag = RootPath
    mRootNode.ImageKey = CacheShellIcon(RootPath)
    mRootNode.SelectedImageKey = mRootNode.ImageKey
    mRootNode.Nodes.Add("*DUMMY*")
    TreeView1.Nodes.Add(mRootNode)

End Sub

Private Sub _BeforeCollapse(sender As Object, e As System.Windows.Forms.TreeViewCancelEventArgs) Handles TreeView1.BeforeCollapse
    ' clear the node that is being collapsed
    e.Node.Nodes.Clear()

    ' and add a dummy TreeNode to the node being collapsed so it is expandable again
    e.Node.Nodes.Add("*DUMMY*")
End Sub

Private Sub _BeforeExpand(sender As Object, e As System.Windows.Forms.TreeViewCancelEventArgs) Handles TreeView1.BeforeExpand
    ' clear the expanding node so we can re-populate it, or else we end up with duplicate nodes
    e.Node.Nodes.Clear()

    AddImages(e)

End Sub

Private Sub _AfterSelect(sender As System.Object, e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterSelect
    e.Node.Nodes.Clear()
    Dim folder As String = CStr(e.Node.Tag)
    If Not folder Is Nothing AndAlso IO.Directory.Exists(folder) Then
        Try
            For Each file As String In IO.Directory.GetFiles(folder)
                e.Node.Nodes.Add(file.Substring(file.LastIndexOf("\"c) + 1))

            Next
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End If
End Sub

Я думаю, что мне нужно попытаться вызвать подпрограмму AddImages из подпрограммы _NodeMouseClick, но я не смог заставить ее работать. AddImages принимает TreeViewCancelEventArgs, а у меня его нет в процедуре _NodeMouseClick.

    Private Sub AddImages(ByRef e As System.Windows.Forms.TreeViewCancelEventArgs)
    '---[ get the directory representing this node ]---
    Dim mNodeDirectory = New IO.DirectoryInfo(e.Node.Tag.ToString)

    '---[ add each subdirectory from the file system to the expanding node as a child node ]---
    For Each mDirectory As IO.DirectoryInfo In mNodeDirectory.GetDirectories
        '---[ declare a child TreeNode for the next subdirectory ]---
        Dim mDirectoryNode As New TreeNode
        '---[ store the full path to this directory in the child TreeNode's Tag property ]---
        mDirectoryNode.Tag = mDirectory.FullName
        '---[ set the child TreeNodes's display text ]---
        mDirectoryNode.Text = mDirectory.Name
        mDirectoryNode.ImageKey = CacheShellIcon(mDirectory.FullName)
        mDirectoryNode.SelectedImageKey = mDirectoryNode.ImageKey
        '---[ add a dummy TreeNode to this child TreeNode to make it expandable ]---
        mDirectoryNode.Nodes.Add("*DUMMY*")
        '---[ add this child TreeNode to the expanding TreeNode ]---
        e.Node.Nodes.Add(mDirectoryNode)
    Next

    '---[ add each file from the file system that is a child of the argNode that was passed in ]---
    For Each mFile As IO.FileInfo In mNodeDirectory.GetFiles
        '---[ declare a TreeNode for this file ]---
        Dim mFileNode As New TreeNode
        '---[ store the full path to this file in the file TreeNode's Tag property ]---
        mFileNode.Tag = mFile.FullName
        '---[ set the file TreeNodes's display text ]---
        mFileNode.Text = mFile.Name
        mFileNode.ImageKey = CacheShellIcon(mFile.FullName)
        mFileNode.SelectedImageKey = mFileNode.ImageKey & "-open"
        '---[ add this file TreeNode to the TreeNode that is being populated ]---
        e.Node.Nodes.Add(mFileNode)
    Next
End Sub

Если у кого-нибудь есть советы, я был бы очень признателен за помощь. Спасибо,

1 Ответ

1 голос
/ 26 марта 2012

Я предполагаю, что проблема в следующем:

Private Sub _AfterSelect(sender As Object, e As TreeViewEventArgs) Handles TreeView1.AfterSelect
    e.Node.Nodes.Clear()
  '// etc
End Sub

Удаляет все узлы, которые вы добавляете в событии BeforeExpand.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...