WPF 팁

Form Designer 프로젝트 #3 - TreeView 삭제 / 이름변경 안떠니 평점: 10.0/10 (1명 참여) 조회: 5244

지난 글에 이어서 TreeView 에 대해서 쓰려고 합니다.
이번에는 아이템의 삭제와 이름 변경입니다.

우선, 이름 변경은 다른 툴에 있는 TreeView 와는 다르게 아이템 위에서 이름 변경이 자체적으로
지원되지 않는다는 겁니다. 많은 시간동안 구글링을 해봤지만, 대부분 2007년 글들이기는 하지만,
제가 지금 쓰고 있는 2012 Visual Studio 에 있는 .NET 4.5 WFP 도 이름 편집 기능은 없는 것 같습니다.
 

있는 걸 발견하시면, 댓글 부탁드립니다.
 

그래서, 이름 변경은 복잡하게 만들지 말구, 아이템 추가처럼, InputBox 띄우고,
그 박스에서 현재값 보여주고 사용자가 편집할 수 있도록 만들었습니다.
 

간단한게 좋은거죠..모....이거 하나하자고...코드를 아주..걸레로 만들 필요 있나요? ^^;
그리고, 삭제 코드를 작성하고 테스트하면서, 착각했던 내용을 발견했습니다.
 

TreeView1.Items.Count
 

는 현재 노드의 아이템 갯수이지...전체 노드의 아이템 갯수가 아니라는 사실~~~~~
사실....TreeView 를 다른 툴에서도...자주 안써서...원래 이런건지..는 잘 모르겠네요. 여튼..
 

그리고, 또 알게 된 것은, 선택된 아이템을 별도 변수로 보관할 필요가 없다는 것입니다.
버튼 클릭했을 때 이벤트에서도 TreeView 의 SelectedItem 을 통해서 언제든지 접근이 가능하다는거..죠.
 

그래서, 지난번에 선택했을때 발생하는 이벤트에서 tvSelectedItem 으로 현재 아이템을 보관하는 코드를
제거하고 아래와 같이 바꿨습니다. 지난 글에도 완성 버전이 있지만...한번 더 반복...
 

else

{

zItemName = Microsoft.VisualBasic.Interaction.InputBox("Enter a new name", "Add", "", -1, -1);

zItemName = zItemName.Trim();

if ((zItemName.Length > 0) && (tvSelectedItem != null)) // SelectedItem 의 널 체크로 변경

{

newChild.Header = zItemName;

//tvSelectedItem.Items.Add(newChild); // 지난 글에서 사용했던 코드

(BOS.SelectedItem as TreeViewItem).Items.Add(newChild); // 이번 글에서 변경한 코드

}

}

 

즉, 위에 tvSelectedItem != null 은 BOS.SelectedItem != null 로 변경하면 되겠죠.
그래서..아이템 추가는 이렇게 변경하고,

<TreeView

에서 사용된

SelectedItemChanged="SelectionChanged"

는 과감히 날려도 되겠네요. cs 에서 구현된 SelectionChanged 도 지워버리구요.
그러면, 이제 삭제하는 코드는

 

        private void Button_Click_2(object sender, RoutedEventArgs e)
        {
            if ((BOS.Items.Count > 0) && (BOS.SelectedItem != null) )
            {
                //BOS.Items.Remove((TreeViewItem)BOS.SelectedItem);
                TreeViewItem parent = (BOS.SelectedItem as TreeViewItem).Parent as TreeViewItem;
                if (parent == null)
                {
                    MessageBox.Show("[Login] can not be removed!");
                }
                else
                {
                    parent.Items.Remove(BOS.SelectedItem);
                }
            }  
        }


위에 주석에서 말한 것처럼, 저 코드를 어디선가 줏었는데요 (지금 모든 코드를 줏어가면서..^^;)
저 코드를 답변으로 달아준 친구도 저처럼 오해한 것 같네요.
 

Items 는 현재 노드이므로 TreeView1.Items.Remove 를 하면 최상단에 있는 아이템만 삭제가 가능하겠죠.
우리는 그런게 아니라, 루트(여기서는 Login 이 루트가 되죠)를 만들고 모두 그 밑으로 들어가 있으니까.
현재 선택된 아이템의 parent 를 구해서 그 parent 에 의해 삭제를 해야하는거죠.
그리고, 삭제전에 부모가 널인지 아닌지 확인하고요.
 

위의 코드는 여기서 줏었습니다.

http://www.dotnetspider.com/forum/183794-How-remove-treeviewitem-from-treeview-control-WPF.aspx

 

그리고, 이제는 아이템의 이름 변경하는 코드입니다.
위에서 말했듯이. 간단한 기능은 간단한 코드로 작성하자~~~
그래서, 아이템 추가했을 때의 코드를 활용해서..다음과 같이...

        private void Button_Click_3(object sender, RoutedEventArgs e)
        {
            String zItemName;

            if ((BOS.Items.Count >= 1) && (BOS.SelectedItem != null))
            {               
                zItemName = (BOS.SelectedItem as TreeViewItem).Header.ToString();               
                zItemName = Microsoft.VisualBasic.Interaction.InputBox("Enter the name", "Rename", zItemName , -1, -1);
                zItemName = zItemName.Trim();
                if (zItemName.Length > 0)
                {
                    (BOS.SelectedItem as TreeViewItem).Header = zItemName;
                }
            }
        }

 

그래서, 변경된 폼은 다음과 같습니다.

 


 





이제 겨우...그럴싸 하죠??? 휴....


<끝>

 

 

 

태그 : InputBox Item Remove Rename TreeView VisualBasic
작성자 정보
안떠니
Level 29
 [EXP.19/50]

메일:  비공개
글등록 +12 456 덧글등록 +3 249
자기소개
회사에서 WPF C# 으로 프로그램을 만들라고 하네요 ^^; (2013년) 2017년, Selenium, NUnit, ExtentReports 로 자동화를 하라고 하네요 ^^
글 공유하기 |
  tweet facebook
2013-02-09 오전 5:20:16
나도한마디
사용자
지송닷넷            [2013-02-09]
Level 99
 [EXP.만랩]
잘봤습니다. 앞으로도 쭉~~~ 부탁드려요 ...

근데 작성 시간이 ... ^^;;
사용자
안떠니            [2013-02-10]
Level 29
 [EXP.19/50]
작성시간까지 눈여겨 보셨네요? 여긴 미국이에요 ^^;
사용자
HOONS            [2013-02-14]
Level 99
 [EXP.만랩]
미국이시면 한국 개발자들좀 스카웃해가주세요 ㅋ
사용자
안떠니            [2013-02-14]
Level 29
 [EXP.19/50]
이미 중국,인도 개발자로 포화 상태에요. 한국인이 낄 틈이 거의 없죠.
전문 개발 분야가 있다면 조금 낫겠지요. 가령, 금융, 게임, GIS, 병원 등...

이런 특수 전문 개발 분야는 링크드인이나 다른 루트를 통해서
지금도 한국 개발자들이 스카웃되고 있죠.

일반 SI 는 전혀 경쟁력이 없구요.
태그로 엮인글
[C#.NET Q&A] treeview정보를 클릭하면 listview에 가져오고 싶습니다.[1]  saki
[C#.NET Q&A] C# TreeVeiw 에서 클릭으로 AfterSelect 가 아닌 시작하자마자 TreeView에 있는 원하는 노트...[1]  너구리꼬리
[C#.NET Q&A] TreeView 메뉴 구성후 MenuStrip으로 띄우기[2]  짱구파워
[C#.NET Q&A] Listview 선택 시 Treeview 에 있는 Node 선택 되게 하는 방법[1]  눈팅
[C#.NET Q&A] [재질문] 동적으로 생성한 treenode에 index로 접근하는 방법?[1]  pangloss
[C#.NET Q&A] treeview 동적 자식노드 할당  pangloss
[C#.NET Q&A] Microsoft.Vbe.Interop.Forms.ComboBox 컨트롤 관련 질무드려요.  훈스훈스훈스
[C#.NET Q&A] TreeView 의 Scrollbar 색상 변경이 가능한가요?  돌침대
[C#.NET Q&A] List<int[]>의 Remove 질문 드립니다[1]+4  현시키
[C#.NET Q&A] TextBox 관련 이벤트 문의 드립니다.[1]  필승불패
글리스트
CheckBox ListBox 샘플[2] 파일첨부 이재웅
RadioButton ListBox 샘플 파일첨부 이재웅
UniformGrid ListBox 샘플 파일첨부 이재웅
Horizontal ListBox 샘플 파일첨부 이재웅
Vertical ListBox 샘플[2] 파일첨부 이재웅
Form Designer 프로젝트 #7 - Tool Window (콘트롤 속성 지정/변경) - 완료![1]+1  안떠니
Form Designer 프로젝트 #6 - Tool Window (콘트롤 추가/삭제) - 완료![3]+1  안떠니
Form Designer 프로젝트 #5 - TreeView Manager  안떠니
Form Designer 프로젝트 #4 - TreeView + XML [1]  안떠니
 ★현재글->   Form Designer 프로젝트 #3 - TreeView 삭제 / 이름변경[2]+2  안떠니
Form Designer 프로젝트 #2 - TreeView 노드 추가[1]  안떠니
Form Designer 프로젝트 #1 - 프로젝트 관리 화면[4]+1  안떠니
실행파일에서 config 파일 변경하기[1]+3  킴언어
계산기[3]  sa2랑
WPF 성능관리  sa2랑
[RE] WPF Performance Suite  sa2랑
WPF에서 내부에서 작업한 내용을 UI에 올릴때 Dispatcher 클래스 사용[1]  지유니
VS와 Blend에서 화면구조 보기 파일첨부 깜디
Canvas 의 Preview 기능 구현하기[1] 파일첨부 깊은물
[Command] 하나의 컨트롤에 여러 커맨드를 등록하는 법[1]  깜디