PROGRAMMING WORKSHOP

.Net FrameWork,VB.Net |TreeView

콘트롤개체를 마우스로 옮기기..

TreeNode를 다른 TreeView의 TreeNode로 옮기기

두개의 TreeView를 만들고



각각의 TreeNode를 마우스로 잡아서 다른 쪽으로 옮기는 것을 흔하게 보았을 것이다
이것을 구현해 보면서 주요한 이벤트프로시져를 챙겨두도록 하자

Public Class Form1
''TreeView 두개를 WithEvents 로 전역변수로 선언하여..
''이벤트프로시져를 사용할수 있게 하도록 하고
    WithEvents oTV As TreeView
    WithEvents oTV_ As TreeView
''폼 로딩이벤트에서 TreeView두개와 데이타를 만들어 넣는다	
    Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
        Dim oNode_1 As TreeNode = Nothing
        Dim oNode_2 As TreeNode = Nothing
        Dim oNode_3 As TreeNode = Nothing
        Dim sText As String = Nothing

        oTV = New TreeView
        oTV.Location = New Point(6, 6)
        oTV.Size = New Size(300, 300)
        For iX As Integer = 1 To 10
            '' 첫째레벨 TreeNode의 text 속성값을 랜덤으로 알파벳을 만드는데
            '' 중복되면 의미가 없다
            '' 그래서 이미 등록된 text의 중복을 찾아내는 것을 LINQ를 사용하는 연습을 하자
            '' 순환문을 돌면서..각 Treenode 개체의 유일한 text값을 찾을때까지
            Do
                sText = Chr(Int(Rnd() * 26) + 65)
                '' LINQ 문... Treeview 개체의 첫째 레벨 Nodes집합체에서
                '' 값이 방금 만든 랜덤 알파벳과 같은 것이 있으면 찾아라!!
                Dim oX = From Q In oTV.Nodes
                         Where Q.text = sText
                         Select Q

                '' oX집합체가 0이면 sText 변수의 값이 유일한 값이라는 의미
                If oX.Count = 0 Then
                    '' 그래서 새자식 Treenode를 만들고, TreeView의 첫째레벨 Node에 추가..
                    oNode_1 = New TreeNode
                    oNode_1.Text = sText
                    oTV.Nodes.Add(oNode_1)
                    Exit Do
                End If
            Loop While True

            For iY As Integer = 1 To Int(Rnd() * 5 + 5)
                oNode_2 = New TreeNode
                '' 만약에 iY값을 Format(iY,"00")을 해주지 않고..
                '' 만들면 어떤결과가 나는지 관찰해 보시기를..
                '' 마지막에 treeview를 정렬을 할때, 원하는대로 정렬이 되지 않는다
                oNode_2.Text = New String(oNode_1.Text, 2) & "_" & Format(iY, "00")
                'oNode_2.Text = New String(oNode_1.Text, 2) & "_" & iY

                oNode_1.Nodes.Add(oNode_2)
                For iZ As Integer = 1 To Int(Rnd() * 10 + 10)
                    oNode_3 = New TreeNode
                    oNode_3.Text = New String(oNode_1.Text, 3) & "_" & Format(iZ, "00")
                    'oNode_3.Text = New String(oNode_1.Text, 3) & "_" & iZ
                    oNode_2.Nodes.Add(oNode_3)
                Next
            Next

        Next
		''정렬을 해주고
		''TreeView의 TreeNodes들이 모두 오름차로 정렬된다
        oTV.Sort()

        '/////////////다른 TreeView는 TreeNode없는 빈탕으로 하나 만들고
        oTV_ = New TreeView
        oTV_.Location = New Point(310, 6)
        oTV_.Size = New Size(300, 300)
		''중요한 속성 AllowDrop을 True 로..
		''이것은 마우스로 어떤 개체를 갖다 놓을때 받아주겠다는 약속
        oTV.AllowDrop = True
        oTV_.AllowDrop = True

        Me.Controls.Add(oTV)
        Me.Controls.Add(oTV_)
        Me.Font = New Font("맑은 고딕", 9)
        Me.AutoSize = True
        Me.Text = "왼쪽 TreeView의  TreeNode를 마우스로 잡아서 오른쪽 TreeView으로 옮기기"
    End Sub
	''TreeView 이벤트는 아래의 4개의 프로시져를 작성해주면 된다
	''하나의 프로시져를 여러개의 같은 콘트롤이 같이 사용할수 있다
	''그래서 두개의 TreeView, 하나는 이름이 oTV, 다른 하나는 oTV_ , 프로시져뒤에 이름을 붙여주면 같은 이벤트를 사용할수 있다
	''Handles 명을 콤마를 찍어서 추가 해주면 된다
	''그래서 위에서 만든 두개의 TreeView콘트롤이 같은 프로시져를 사용한다
    Private Sub oTV_DragDrop(sender As Object, e As System.Windows.Forms.DragEventArgs) Handles oTV.DragDrop, oTV_.DragDrop

    End Sub

    Private Sub oTV_DragEnter(sender As Object, e As System.Windows.Forms.DragEventArgs) Handles oTV.DragEnter, oTV_.DragEnter

    End Sub

    Private Sub oTV_DragOver(sender As Object, e As System.Windows.Forms.DragEventArgs) Handles oTV.DragOver, oTV_.DragOver


    End Sub

    Private Sub oTV_ItemDrag(sender As Object, e As System.Windows.Forms.ItemDragEventArgs) Handles oTV.ItemDrag, oTV_.ItemDrag

    End Sub

TreeNode의 위치를 마음대로 이동하여 같은 TreeView내에서도 위치를 바꿀수 있다
아마도 어떤프로젝트의 작업명들을 정렬을 가나나순이나 알파벳순서가 아닌
임의의 원하는 순서대로 정렬을 할수 없을때 TreeView를 활용하여 이동시켜서
정렬순서를 정한다면 편리할 것이다



***[LOG-IN]***