Category

마메의여행기 (252)
사진 (84)
여행 (11)
등산 (30)
정보 (91)
개발 (36)

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문을 두어서 
                  노드클릭 이벤트는 라벨을 클릭할때만 발생하게 하고,
                  체크이벤트는 체크를 클릭할 때만 발생하게 함(체크를 변경할 때마다 반복되는 문제도 해결됨)