Category

마메의여행기
사진
여행
등산
정보
개발

Search

Blog Menu

    [VB6→VB.NET] TreeView

    1. 클릭 이벤트로 선택한 노드를 지정할 때
    [VB6]
    Private Sub tvwCenterDivision_Click()
    Select Case Left(tvwCenterDivision.SelectedItem.Key, 2)

    [VB.NET] 자동변환
    Private Sub tvwCenterDivision_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles tvwCenterDivision.Click
    Select Case VB.Left(tvwCenterDivision.SelectedNode.Name, 2)
    문제점 → 노드를 여러번 선택했을 때, 선택한 노드가 아닌 그 전의 노드.
                  즉, 클릭 이벤트에 들어가기전에 셀렉트된 노드를 컨트롤하게 된다.

    [VB.NET] 수정
    Private Sub tvwCenterDivision_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.Windows.Forms.TreeNodeMouseClickEventArgs) Handles tvwCenterDivision.NodeMouseClick
            On Error GoTo Err_tvwCenterDivision_Click

            Dim Node As System.Windows.Forms.TreeNode = eventArgs.Node
          
            Select Case VB.Left(Node.Name, 2)
    해결방법 → 이벤트 引数를 컨트롤한다.

    2. 親노드와 子노드를 연동하고, 라벨과 체크박스 이벤트를 같게 하는 방법
    [VB6]
    Private Sub tvwJob_NodeCheck(ByVal Node As MSComctlLib.Node)
        Dim nodTray As Node
        Dim k       As Integer

        '親ツリー項目をチェックする
        If Node.Parent Is Nothing Then
        Else
            If Node.Checked Then
                Node.Parent.Checked = True
            End If
        End If

        'サブツリー項目を取得
        Set nodTray = Node.Child
        'サブツリー項目のチェック状態を親に合わせる
        For k = 1 To Node.Children
            nodTray.Checked = Node.Checked
            Set nodTray = nodTray.Next
        Next k
    End Sub

    Private Sub tvwJob_NodeClick(ByVal Node As MSComctlLib.Node)
        '項目がクリックされたらチェックと連動する
        If Node.Checked Then
            Node.Checked = False
        Else
            Node.Checked = True
        End If

        tvwJob_NodeCheck Node
    End Sub

    [VB.NET] 자동변환
     Private Sub tvwJob_AfterCheck(ByVal eventSender As System.Object, ByVal eventArgs As System.Windows.Forms.TreeViewEventArgs) Handles tvwJob.AfterCheck
      Dim Node As System.Windows.Forms.TreeNode = eventArgs.Node
      Dim nodTray As System.Windows.Forms.TreeNode
      Dim k As Short
      '親ツリー項目をチェックする
      If Node.Parent Is Nothing Then
      Else
       If Node.Checked Then
        Node.Parent.Checked = True
       End If
      End If
      'サブツリー項目を取得
      nodTray = Node.FirstNode
      'サブツリー項目のチェック状態を親に合わせる
      For k = 1 To Node.GetNodeCount(False)
       nodTray.Checked = Node.Checked
       nodTray = nodTray.NextNode
      Next k
     End Sub
     Private Sub tvwJob_NodeClick(ByVal eventSender As System.Object, ByVal eventArgs As System.Windows.Forms.TreeNodeMouseClickEventArgs) Handles tvwJob.NodeMouseClick
      Dim Node As System.Windows.Forms.TreeNode = eventArgs.Node
      '項目がクリックされたらチェックと連動する
      If Node.Checked Then
       Node.Checked = False
      Else
       Node.Checked = True
      End If
      tvwJob_AfterCheck(tvwJob, New System.Windows.Forms.TreeViewEventArgs(Node))
     End Sub
    문제점 → 체크박스를 선택해도 노트클릭 이벤트가 발생해서 체크가 원래대로 돌아옴
                  체크박스 클릭 이벤트 안에 체크를 변경하면 다시 체크박스 클릭 이벤트가 발생하여 무한반복에 빠짐            

    [VB.NET] 수정
        '=====================================================================
        ' 目的説明  -- ツリー - チェック(子連動)
        ' 引数      --
        ' 戻り値    -- なし
        '---------------------------------------------------------------------
        Private Sub CheckAllChildNodes(ByVal treeNode As TreeNode, ByVal nodeChecked As Boolean)
            Dim node As TreeNode

            For Each node In treeNode.Nodes
                node.Checked = nodeChecked
                If node.Nodes.Count > 0 Then
                    Me.CheckAllChildNodes(node, nodeChecked)
                End If
            Next node
        End Sub

        '=====================================================================
        ' 目的説明  -- ツリー - チェック
        ' 引数      --
        ' 戻り値    -- なし
        '---------------------------------------------------------------------
        Private Sub node_AfterCheck(ByVal sender As Object, ByVal e As TreeViewEventArgs) Handles tvwJob.AfterCheck
            Dim Node As System.Windows.Forms.TreeNode = e.Node

            If e.Action <> TreeViewAction.Unknown Then
                If Node.Parent Is Nothing Then
                Else
                    If Node.Checked Then
                        Node.Parent.Checked = True
                    End If
                End If
                If e.Node.Nodes.Count > 0 Then
                    Me.CheckAllChildNodes(e.Node, e.Node.Checked)
                End If
            End If
        End Sub

        '=====================================================================
        ' 目的説明  -- ツリー - クリック
        ' 引数      --
        ' 戻り値    -- なし
        '---------------------------------------------------------------------
        Private Sub tvwJob_NodeClick(ByVal eventSender As System.Object, ByVal eventArgs As System.Windows.Forms.TreeNodeMouseClickEventArgs) Handles tvwJob.NodeMouseClick
            Dim Node As System.Windows.Forms.TreeNode = eventArgs.Node
            Dim ht As TreeViewHitTestInfo = tvwJob.HitTest(eventArgs.Location)

            '項目がクリックされたらチェックと連動する
            If ht.Location = TreeViewHitTestLocations.Label Then
                ht.Node.Checked = Not ht.Node.Checked
                If Node.Parent Is Nothing Then
                Else
                    If Node.Checked Then
                        Node.Parent.Checked = True
                    End If
                End If
                If Node.Nodes.Count > 0 Then
                    Me.CheckAllChildNodes(Node, Node.Checked)
                End If
            End If
        End Sub
    해결방법 →  노드클릭 이벤트와 체크 이벤트에 이벤트를 확인하는 IF문을 두어서 
                      노드클릭 이벤트는 라벨을 클릭할때만 발생하게 하고,
                      체크이벤트는 체크를 클릭할 때만 발생하게 함(체크를 변경할 때마다 반복되는 문제도 해결됨)