none
TreeView控件编程 RRS feed

  • 问题

  • 利用Visual Basic 2010编辑TreeView控件,要求左鼠标键(无论是单击还是双击)均不选中复选框,右鼠标双击被选中,且除根节点之外只有一个子节点被选中。目前,单击时我能够做到不选中,但在复选框上双击时,此控件的Check(BeforeCheck、AfterCheck)和Select(BeforeSelect、AfterSelect)事件均未响应(在此事件上设置断点或信息对话框都没有作出响应,表明这几个事件没有执行)而复选被选中,再次单击此处(鼠标不要移动),则控件以双击事件响应;第一次双击被选中,再次双击被取消,何故?我的QQ号346165419。BlueblueSummerSkyMike Feng老师,下面是我经过删减后的代码段,请在百忙给予指导:

    1. 窗体启动事件

       Private Sub FormMain_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Dim strFile As String
            TreeViewFile.Nodes.Clear()
           ' 向TreeView添加节点。若在设计时添加根节点和子节点,则此调用过程省略
            Call AddFileToTreeView(Application.StartupPath & "\Methods", CurrentMethodFile, "*.mth", TreeViewFile)
            ' 下列代码段显示TreeView控件树节点复选框选中(也可不要,否则需要提供CurrentMethodPath的值)
            With TreeViewFile
                ' 确认当前节点有子节点
                If .Parent.HasChildren Then
                    ' 则遍历节点名为CurrentMethodPath指定的整个子节点
                    For Each NodeX As TreeNode In .Nodes(CurrentMethodPath).Nodes
                        ' 如果找到的子节点显示文本是所需要的
                        strFile = Microsoft.VisualBasic.Left(CurrentMethodFile, Len(CurrentMethodFile) - Len(".mth"))
                        If NodeX.Text = strFile Then
                            ' 则将其子节点的复选框选中。此段代码相继引发BeforeCheck和AfterCheck事件
                            NodeX.Checked = True
                        End If
                    Next
                End If
            End With
    End Sub

    2. 创建AddFileToTreeView过程,向TreeView添加表示某一文件夹及其符合扩展名要求的文件的子节点

           ' 此过程内的任何代码都不会执行过程外的事件,如给TreeView控件赋值不会引发其事件的发生,因为TreeView控件还没有创建实例
        ' 参数:
        ' Path —— 文件路径;
        ' File —— Path下的文件;
        ' ExpandName —— File的扩展名
        Public Sub AddFileToTreeView(ByVal Path As String, ByVal File As String, _
                                     ByVal ExpandName As String, ByVal TreeViewX As TreeView)
            Dim strTemp As String
            Dim Position As Integer
            Dim RootNode As TreeNode
            Dim ChildNodes As TreeNode
            If Not My.Computer.FileSystem.DirectoryExists(Path) Then
                Exit Sub
            End If

            With TreeViewX
                .ShowPlusMinus = True
                '.Nodes.Item(Path).Text = Path
                strTemp = "加载的文件  " & Path & "  已经存在于列表中。"
                For Each NodeX As TreeNode In .Nodes
                    If NodeX.Text = Path Then
                        MsgBox(strTemp, CType(MsgBoxStyle.Exclamation + MsgBoxStyle.OkOnly, MsgBoxStyle), "文件重复")
                        Exit Sub
                    End If
                Next
                RootNode = .Nodes.Insert(.GetNodeCount(False), Path)
                RootNode.Name = Path
                RootNode.Tag = Path
                For Each foundFile As String In
                    My.Computer.FileSystem.GetFiles(Path, FileIO.SearchOption.SearchTopLevelOnly, ExpandName)
                    Position = Len(foundFile) - Len(Path) - 1
                    strTemp = Microsoft.VisualBasic.Right(foundFile, Position)
                    ChildNodes = RootNode.Nodes.Add(RootNode.Name & CStr(.GetNodeCount(False)), strTemp)
                    ChildNodes.Tag = strTemp
                Next
                .ExpandAll()
            End With
        End Sub

    3. 在TreeView控件的MouseDown事件中添加如下代码,首先将击键数保存在MouseClicks,随后调用CheckedNodes过程

       Private Sub TreeViewFile_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TreeViewFile.MouseDown
            MouseClicks = e.Clicks
            Debug.Print(CStr(MouseClicks))
            ' ******如果鼠标不是双击则直接退出
            If MouseClicks <= 1 Then Exit Sub
            ' 处理双击后向TreeView控件中添加文本
            Call CheckedNodes(e, TreeViewFile)
        End Sub

    4. 自定义CheckedNodes过程。此过程可从TreeView控件的任一双击事件中调用,如NodeMouseDoubleClick、DoubleClick、MouseDoubleClick。

        ' 检查TreeView控件所选择的节点
        Private Sub CheckedNodes(ByVal e As MouseEventArgs, ByVal TreeViewX As TreeView)
            ' ******处理鼠标双击事件:限定右鼠标键才可执行此过程内的代码段
            If e.Button <> MouseButtons.Right Then   Exit Sub
            ' 检索当前鼠标单击处的节点。
            Dim Position As Integer
            Dim intX As Integer

            ' 鼠标单击的节点。
            Dim p As Point = New Point(e.X, e.Y)
            ' 找到单击的节点。
            Dim NodeClick As TreeNode = TreeViewX.GetNodeAt(p)
            Dim m_OldSelectNode As TreeNode
            If Not NodeClick Is Nothing Then
                TreeViewFile.SelectedNode = NodeClick
             End If
            With NodeClick
                ' 阻止在其父节点上作出响应
                If IsNothing(.Parent) Then
                    .Checked = False
                    Exit Sub
                End If

                For Position = 0 To TreeViewX.GetNodeCount(False) - 1
                    For intX = 0 To TreeViewX.Nodes.Item(Position).GetNodeCount(True) - 1
                        ' 下列赋值的结果会引发TreeViewFile_AfterCheck事件
                        TreeViewX.Nodes.Item(Position).Nodes(intX).Checked = False
                    Next
                Next
                ' 下列赋值的结果会引发TreeViewFile_AfterCheck事件
                .Checked = True

            End With
        End Sub

    5. 在TreeView控制的Check或Select事件中添加如下代码,本例在BeforeCheck事件中添加阻止复选的代码

        ' 单击TreeView控件复选框或给节点的Checked属性赋值时将引发此事件
        Private Sub TreeViewFile_BeforeCheck(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeViewCancelEventArgs) Handles TreeViewFile.BeforeCheck
            ' 阻止因鼠标键而对复选框进行选择,但赋值语句除外 And MouseClicks <= 1
            If e.Action = TreeViewAction.ByMouse Then
                e.Cancel = True
                Debug.WriteLine("TreeViewFile_BeforeCheck  " & MouseClicks)
            End If
        End Sub

        上述程序,单击任一节点,都不会被选中。鼠标左键在节点的文本上双击,不会被选中,但在节点的复选框中双击则会被选中,再次双击复选框被取消。我要求是鼠标右键双击才能被选中,目的是增加选中的难度,因为选中的文件是存贮数据采集方法的;且只有一个子节点被选中,不能有同时被选中的现象,但在节点的复选框中双击就出现了多个子节点被选中的现象,这是我不希望看到的。

        请各位老师给予指导。谢谢!





    • 已编辑 虫鸟 2012年10月10日 10:40
    2012年10月7日 13:43

全部回复

  • 请把相应的代码贴出来,这样才能更好的发现问题。

    2012年10月8日 12:56
  • 您好,这句话:

    >>要求左鼠标键(无论是单击还是双击)均不选中复选框,右鼠标双击被选中,单击时能够做到不选中,但在复选框上双击时,此控件的Check和Select事件均未响应而复选被选中,再次单击该控件上的任一节点,则控件以双击事件响应,而且复选被取消,何故?

    表示“要求”的是那些句子?句号是在哪打的?哪些句子表示现象,哪些句子表示结果?你如何处理check and select事件的?具体的复现你的问题的步骤是什么,能用“1,2,3”这样标明吗?

    另外, 如blueblueSummersky所说,最好能把你的代码贴出来。

    谢谢!


    Mike Feng
    MSDN Community Support | Feedback to us
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年10月9日 6:28
    版主