본문 바로가기
개발언어/VB

TreeView구현방법

by 엔돌슨 2007. 11. 21.
반응형
TreeView는 계층적 구조를 갖는 데이터를 보기 좋게 표현하는데 편리하다. Button1, TextBox1을 폼에 만들어 넣는다. TreeView 하나를 추가하고 그 이름을 [Tree]라고 하자.

[예제1] Tree에 데이터 싣기. 폼이 로드될 때 데이터도 같이 싣는다.
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Tree.PathSeparator = "-"
    Tree.ShowPlusMinus = True
    Tree.Nodes.Clear()
    Tree.Nodes.Add("대한민국")

    '방법1
    Tree.Nodes(0).Nodes.Add("경기도")
    Tree.Nodes(0).Nodes(0).Nodes.Add("안양")
    Tree.Nodes(0).Nodes(0).Nodes.Add("수원")
    Tree.Nodes(0).Nodes(0).Nodes.Add("평택")

    '방법2
    Dim N1 As New TreeNode("춘천")
    Dim N2 As New TreeNode("강릉")
    Dim N3 As New TreeNode("원주")
    Dim Cities() As TreeNode = {N1, N2, N3}
    Dim State As New TreeNode("강원도", Cities)
    Tree.Nodes(0).Nodes.Add(State)

    '방법3
    Tree.Nodes(0).Nodes.Add("충청북도")
    Dim CB As TreeNodeCollection = Tree.Nodes(0).Nodes(2).Nodes
    CB.Add("청주") : CB.Add("괴산") : CB.Add("충주")

    '방법4
    Dim NdCN As TreeNode = New TreeNode("충청남도")
    Tree.Nodes(0).Nodes.Add(NdCN)
    Dim K As Integer = Tree.Nodes(0).Nodes.IndexOf(NdCN)
    Dim CN As TreeNodeCollection = Tree.Nodes(0).Nodes(K).Nodes
    CN.Add("천안") : CN.Add("아산") : CN.Add("보령")

    '방법5
    Tree.Nodes(0).Nodes.Add("전라북도")
    Dim L As Integer = Tree.Nodes(0).Nodes.Count - 1
    Dim JB As TreeNodeCollection = Tree.Nodes(0).Nodes(L).Nodes
    JB.Add("전주") : JB.Add("군산") : JB.Add("남원")

    Tree.ExpandAll()
End Sub

[예제2] 어떤 아이템(노드라 한다)을 선택하면 그 선택항목을 TextBox1에 적는다. 만약 [충청북도]을 선택했다면
Private Sub Tree_AfterSelect(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles Tree.AfterSelect
    TextBox1.Text = Tree.SelectedNode.Text
End Sub

기타 노드에 대해 얻을 수 있는 정보들은 다음과 같다. 만약 지정한 노드가 없으면 에러가 된다.
    TextBox1.Text = Tree.SelectedNode.Text                  '충청북도
    TextBox1.Text = Tree.SelectedNode.Index                '=2. 노드가 속한 그룸에서의 인덱스. 맨위=0
    TextBox1.Text = Tree.SelectedNode.FullPath            '대한민국-충청북도
    TextBox1.Text = Tree.SelectedNode.Parent.Text        '대한민국
    TextBox1.Text = Tree.SelectedNode.PrevNode.Text    '강원도. 없으면 에러로 된다.
    TextBox1.Text = Tree.SelectedNode.NextNode.Text     '충청남도
    TextBox1.Text = Tree.SelectedNode.FirstNode.Text     '청주
    TextBox1.Text = Tree.SelectedNode.LastNode.Text     '충주
    TextBox1.Text = Tree.SelectedNode.Nodes.Count       '3 ... 자식노드의 갯수

[예제3] 충청남도 노드가 확장되어 있으면 축소하고 축소되어 있으면 확장한다.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim ND As TreeNode
    For Each ND In Tree.Nodes(0).Nodes
        If ND.Text = "충청남도" Then Exit For
    Next

    If ND Is Nothing Then MsgBox("노드가 없네요") Else ND.Toggle()
End Sub

[예제4] 모든 노드를 축소하고 충청남도만 확장한다.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Tree.Nodes(0).ExpandAll()
    Dim ND As TreeNode
    For Each ND In Tree.Nodes(0).Nodes
        If ND.Text = "충청남도" Then
            ND.ExpandAll()
        Else
            If ND.IsExpanded Then ND.Toggle()
        End If
    Next
End Sub

[예제5] 노드의 삭제
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    If Tree.SelectedNode Is Nothing Then
        MsgBox("삭제할 노드를 고르세요")
    Else
        Tree.Nodes(0).Nodes.Remove(Tree.SelectedNode)
        Tree.SelectedNode = Nothing '이게 없으면 삭제된 다음 노드가 선택된 것으로 여긴다.
    End If
End Sub

[예제6] 노드 값의 수정
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    If Tree.SelectedNode Is Nothing Then
        MsgBox("수정할 노드를 고르세요")
    Else
        Tree.SelectedNode.Text = "다음"
    End If
End Sub

[예제7] 노드의 삽입/추가
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    If Tree.SelectedNode Is Nothing Then MsgBox("삽입할 노드를 고르세요") : Exit Sub
    Dim K As Integer = Tree.SelectedNode.Index
    Dim Papa As TreeNode = Tree.SelectedNode.Parent
    Dim ND As New TreeNode("신도시")
    Papa.Nodes.Insert(K, ND)     '선택노드 앞에 추가
    Papa.Nodes.Add("공항")       '맨뒤에 추가
End Sub

기타 속성들
Tree.Indent = 40 '각 계층간 들여쓰기의 크기. 초기치는 19