통합검색
· 마을서비스란?  · 포럼마을  · 일반마을  · 테마마을  · 마을랭킹  · 활동왕
· 덱스퍼트란?  · TECBOX   · PRSBOX   · 이용안내  
· DEXT제품군  · 솔루션베이  · S/W & ESD 컴포넌트
· 프로그램베이
· LiveSeminar  · LiveConference
WPF & Silverlight 포럼마을입니다.
  마을등급 WPF & Silverlight   이 마을은 포럼마을 입니다이 마을은 자유가입제 마을 입니다 마을소개 페이지로 이동 전입신청
마을촌장촌장 서학수 주민 728 since 2008-07-17
우리마을 공지사항
질문&답변
강좌&팁
자유게시판
자료실
앨범
[마을 게시판]
WPF 강좌
랑데브 게시판
칼럼 게시판
개발자 고충상담
Dev Talk
자유토론방
벼룩시장
재나미 우스개
구인/프로젝트 정보
사람인 채용 게시판
  고객지원 게시판
마이 데브피아
 나의 e-Money 내역
 활동왕 My Page
 스크랩한 게시글보기
 쪽지관리
 주소록관리

 강좌&팁
 Form Designer 프로젝트 #3 - TreeView 추가  | WPF 2013-02-08 오전 8:42:34
 jek11  jek11님께 메시지 보내기jek11님을 내 주소록에 추가합니다.jek11님의 개인게시판 가기 번호: 162 추천:0  / 읽음:10,180

지난 글에 이어서 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 as TreeViewItem).Parent != null))

{

//BOS.Items.Remove((TreeViewItem)BOS.SelectedItem);   // 이건 작동을 안합니다.

TreeViewItem parent = (BOS.SelectedItem as TreeViewItem).Parent as TreeViewItem;

if (parent != null)

{

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;

}

}

}

 

 

 

이렇게 해서, [All +], [All -] 버튼은 내다 버렸습니다. ㅋㅋㅋ

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

 

 

 

 

 

 

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

 

 

 

 

코멘트쓰기
  좋음   놀람   궁금   화남   슬픔   최고   침묵   시무룩   부끄럼   난감
* 코멘트는 500자 이내(띄어쓰기 포함)로 적어주세요.
목록 보기   지금 보고 계시는 글을 회원님의 my Mblog >> 스크랩에 넣어두고 다음에 바로 보실 수 있습니다.  
회사소개  |   개인정보취급방침  |  제휴문의  |   광고문의  |   E-Mail 무단수집거부  |   고객지원  |   이용안내  |   세금계산서
사업자등록번호 안내: 220-81-90008 / 통신판매업신고번호 제 2017-서울구로-0055호 / 대표: 홍영준, 서민호
08390, 서울시 구로구 디지털로32길 30, 1211호 / TEL. 02_6719_6200 / FAX. 02-6499-1910
Copyright ⓒ (주) 데브피아. All rights reserved.