본문 바로가기

기타/과제

재귀함수 호출 트리(예제)

[재귀함수를 사용한 트리뷰(TreeView)]

 

< 실행 화면 >

1. Address_Box TextBox 8. Btn_FirstChild Buttion
2. Btn_Search Button 9. Btn_LastChild Buttion
3. Btn_Expand Button 10. ListBox1 ListBox
4. Btn_Collapse Button 11. Btn_BeforeChild Buttion
5. TreeView1 TreeView 12. Btn_NextChild Buttion
6. Parent_Box TextBox 13. Btn_Remove Buttion
7. Child_Box TextBox    

 

 

 

① 폴더 경로 찾아서 트리구조로 뿌려주기

 

1-1. Btn_Search 버튼 Click 이벤트

private void Btn_Search_Click(object sender, EventArgs e)
        {
            Address_Box.Clear();
            ShowFolderopenDialog();
        }

 

1-2. 폴더 경로 찾기

public void ShowFolderopenDialog()
        {
            FolderBrowserDialog fbd = new FolderBrowserDialog();
            if (fbd.ShowDialog() == DialogResult.OK)
            {
                Address_Box.Text = fbd.SelectedPath;
            }
        }

 

1-3. 폴더 경로 가져오기

// 폴더 경로 가져오기 메소드
private void TreeViewLoadPath(TreeView treeView, string path)
        {
            if (string.IsNullOrEmpty(Address_Box.Text))
            {
                return;
            }
            treeView.Nodes.Clear();

            DirectoryInfo rootDirectoryInfo = new DirectoryInfo(path);

            treeView.Nodes.Add(CreateDirectoryNode(rootDirectoryInfo));
        }
        
// 폴더 경로 가져오기 메소드(재귀함수)
private TreeNode CreateDirectoryNode(DirectoryInfo directoryInfo)
        {
            TreeNode directoryNode = new TreeNode(directoryInfo.Name);
            try
            {
                foreach (var directory in directoryInfo.GetDirectories())
                    directoryNode.Nodes.Add(CreateDirectoryNode(directory));

            }
            catch (Exception)
            {

            }
            return directoryNode;
        }

 

1-4. 폴더 경로 트리구조로 뿌려주기

private void Address_Box_TextChanged(object sender, EventArgs e)
        {
            TreeViewLoadPath(TreeView1, Address_Box.Text);
        }

 

 

 

 

② 트리구조 펼치기/접기

private void Btn_Collapse_Click(object sender, EventArgs e)
        {
            TreeView1.CollapseAll();
        }

private void Btn_Expand_Click(object sender, EventArgs e)
        {
            TreeView1.ExpandAll();
        }

 

 

 

 

③ 첫번째 자식/마지막 자식 추가하기

 

3-1. 트리뷰의 노드 선택 이벤트

 private void TreeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
            ListBox1.Items.Clear();
            TreeNode node = TreeView1.SelectedNode;

            if (node == null)
            {
                ParentBox.Text = string.Empty;
                ParentBox.Tag = TreeView1.TopNode;
                Btn_Remove.Enabled = false;
                return;
            }
            ParentBox.Text = node.Text;
            ParentBox.Tag = node;
            Btn_Remove.Enabled = true;
            foreach (TreeNode snode in node.Nodes)
            {
                ListBox1.Items.Add(snode);
            }
        }

 

3-2. 첫번째 자식/마지막 자식 추가하기

 private void Btn_FirstChild_Click(object sender, EventArgs e)
        {
            TreeNode node = ParentBox.Tag as TreeNode;

            if (node == null)
            {
                TreeView1.Nodes.Insert(0, ChildBox.Text);
            }
            else
            {
                node.Nodes.Insert(0, ChildBox.Text);
                node.Expand();
            }
            ChildBox.Text = string.Empty;
        }

private void Btn_LastChild_Click(object sender, EventArgs e)
        {
            TreeNode node = ParentBox.Tag as TreeNode;

            if (node == null)
            {
                TreeView1.Nodes.Add(ChildBox.Text);
            }
            else
            {
                node.Nodes.Add(ChildBox.Text);
                node.Expand();
            }
            ChildBox.Text = string.Empty;
        }

 

 

 

 

④ 이전 자식/다음 자식 추가하기

 

4-1. 노드 목록 선택 이벤트

private void ListBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            bool selected = (ListBox1.SelectedIndex != -1);
            Btn_BeforeChild.Enabled = selected;
            Btn_NextChild.Enabled = selected;
        }

 

4-2. 이전 자식/다음 자식 추가하기

private void Btn_BeforeChild_Click(object sender, EventArgs e)
        {
            TreeNode tn = ListBox1.SelectedItem as TreeNode;
            TreeNode pn = tn.Parent;
            pn.Nodes.Insert(tn.Index, ChildBox.Text);
            ChildBox.Text = string.Empty;
        }

private void Btn_NextChild_Click(object sender, EventArgs e)
        {
            TreeNode tn = ListBox1.SelectedItem as TreeNode;
            TreeNode pn = tn.Parent;
            pn.Nodes.Insert(tn.Index + 1, ChildBox.Text);
            ChildBox.Text = string.Empty;
        }

 

 

 

 

⑤ 선택한 노드가 있으면 삭제하기

 private void Btn_Remove_Click(object sender, EventArgs e)
        {
            TreeView1.SelectedNode.Remove();
            ParentBox.Tag = null;
            ParentBox.Text = string.Empty;
        }

 

 

 

 

< 실행 화면 >

 

'기타 > 과제' 카테고리의 다른 글

컨트롤 바인딩(예제)  (0) 2020.12.02
재귀 함수 호출 트리(개념)  (0) 2020.11.18
카카오챗봇 : 오픈빌더 도움말  (0) 2020.11.16
IBS 상품관리  (0) 2020.11.13