1. 클릭 이벤트로 선택한 노드를 지정할 때
[VB6]
[VB.NET] 자동변환
즉, 클릭 이벤트에 들어가기전에 셀렉트된 노드를 컨트롤하게 된다.
[VB.NET] 수정
2. 親노드와 子노드를 연동하고, 라벨과 체크박스 이벤트를 같게 하는 방법
[VB6]
[VB.NET] 자동변환
체크박스 클릭 이벤트 안에 체크를 변경하면 다시 체크박스 클릭 이벤트가 발생하여 무한반복에 빠짐
[VB.NET] 수정
노드클릭 이벤트는 라벨을 클릭할때만 발생하게 하고,
체크이벤트는 체크를 클릭할 때만 발생하게 함(체크를 변경할 때마다 반복되는 문제도 해결됨)
[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)
해결방법 → 이벤트 引数를 컨트롤한다.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
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
문제점 → 체크박스를 선택해도 노트클릭 이벤트가 발생해서 체크가 원래대로 돌아옴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문을 두어서 ' 目的説明 -- ツリー - チェック(子連動)
' 引数 --
' 戻り値 -- なし
'---------------------------------------------------------------------
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
노드클릭 이벤트는 라벨을 클릭할때만 발생하게 하고,
체크이벤트는 체크를 클릭할 때만 발생하게 함(체크를 변경할 때마다 반복되는 문제도 해결됨)
'개발 > .Net' 카테고리의 다른 글
[VB.NET] 픽쳐박스에 이미지파일을 표시후 바로 삭제하는 방법 (0) | 2010.12.17 |
---|---|
[VB6→VB.NET] ListView (0) | 2010.12.16 |
[VB.NET] Form 명령어 (0) | 2010.12.16 |
[VB6→VB.NET] 배경색 변경 (0) | 2010.12.16 |
[VB6→VB.NET] 문자열 변환 (0) | 2010.12.16 |
[VB6] 엑셀파일 DB Import (0) | 2010.08.18 |
[VB6] 실행 파일의 하위에 존재하는 파일목록 얻어오기 (0) | 2010.08.18 |
[VB6] 리스트뷰(ListView)의 각 열의 배경색 변경하기 (0) | 2010.08.04 |
[VBA] 엑셀에서 MSSQL Server 접속하기 (0) | 2009.11.20 |
[VBA] 엑셀 -> MS SQL (0) | 2009.11.20 |