블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2797)
Unity3D (853)
Programming (479)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (185)
협업 (61)
3DS Max (3)
Game (12)
Utility (68)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday
이 문서에서는 TreeView 컨트롤 노드의 설명을 추가하는 방법에 대해 설명합니다. 도구 설명 위에 마우스 포인터를 일시 TreeNode에 대한 정보를 표시합니다. TreeView 컨트롤의 ToolTip 속성이 없지만 도구 설명 컨트롤의 도구 설명 기능을 제공할 수 있습니다.

이 문서에 설명되어 있는 예제를 사용하여 요일을 표시하는 TreeView 컨트롤을 사용하여 보여 줍니다. 마우스 포인터가 있는 TreeNodes 중 하나 위에 멈추면 주의 요일을 나타내는 도구 설명이 나타납니다.

요구 사항

다음은 권장되는 하드웨어, 소프트웨어, 네트워크 인프라 및 필요한 서비스 팩의 목록입니다.
  • Microsoft Visual Studio .NET 또는 Microsoft Visual Studio 2005
이 문서에서는 사용자가 다음 항목을 잘 알고 있다고 가정합니다.
  • Visual C# 구문
  • Windows 폼

만들기 및 예제 양식 채우기

  1. Visual C# 에서 새 Windows 프로그램을 만듭니다.
  2. TreeView 컨트롤을 Form1에 추가하십시오.
  3. ToolTip 컨트롤을 Form1에 추가하십시오.

도구 설명을 위해 TreeNodes 추가

  1. Form1 로드 이벤트에 다음 코드를 붙여 넣습니다.
    // Create a root node.
    TreeNode rootNode = treeView1.Nodes.Add("Day of Week");
    
    // Create a series of child nodes and then set the Tag property for each.
    for (int count = 0; count <= 6; count++)
    {
       DayOfWeek day = (DayOfWeek)count;
       TreeNode childNode = rootNode.Nodes.Add(day.ToString());
       childNode.Tag = "This day is " + day.ToString() + ".";
    }
    
    // Expand all of the TreeView nodes.
    rootNode.ExpandAll();
    					
  2. TreeView MouseMove 이벤트에 다음 코드를 붙여 넣습니다.
    // Get the node at the current mouse pointer location.
    TreeNode theNode =  this.treeView1.GetNodeAt(e.X, e.Y);
    
    // Set a ToolTip only if the mouse pointer is actually paused on a node.
    if ((theNode != null))
    {
       // Verify that the tag property is not "null".
       if (theNode.Tag != null)
       {
          // Change the ToolTip only if the pointer moved to a new node.
          if (theNode.Tag.ToString()!=this.toolTip1.GetToolTip(this.treeView1))
          {
             this.toolTip1.SetToolTip(this.treeView1, theNode.Tag.ToString());
          }
       }     
       else
       {
          this.toolTip1.SetToolTip(this.treeView1, "");
       }
    }
    else     // Pointer is not over a node so clear the ToolTip.
    {
       this.toolTip1.SetToolTip(this.treeView1, "");
    }
    					
    노트 해당 코드는 Visual Studio 2005에서 변경해야 합니다. Windows Forms 프로젝트를 만들 때 Visual C# 한 폼을 프로젝트에 기본적으로 추가됩니다. 이 폼은 Form1을 이라고 합니다. 폼을 나타내는 두 파일의 Form1.cs 및 Form1.designer.cs가 지정됩니다. Form1.cs 있는 코드를 작성할 수 있습니다. Windows Forms 디자이너 도구 상자에서 컨트롤을 끌어서 의해 수행된 모든 작업을 구현하는 코드를 기록하는 위치 designer.cs 파일이 없습니다. Windows Forms 디자이너를 Visual C# 2005에 [NULL]에 대한 자세한 내용은 다음 Microsoft 웹 사이트를 방문하십시오.
  3. 저장하고 프로그램을 실행하십시오. 노드 중 하나에서 마우스 포인터를 잠시 두면 도구 설명이 나타납니다.


    출처 : http://support.microsoft.com/kb/322634/ko 
반응형

'Programming > C#' 카테고리의 다른 글

is 비교 연산자, as 연산자  (0) 2011.11.29
effective c# - 1  (0) 2011.11.29
TreeView에서 Find 함수 사용 방법  (0) 2011.11.20
C# C++ COM Interop  (0) 2011.11.15
C#에서 포인터  (0) 2011.11.15
Posted by blueasa
, |

[참조]


위에 보면 Find 함수를 쓴다.
[예: treeNode.Nodes.Find(string key, bool searchAllChildren)]

그런데 직접 만들고 써보니 찾지를 못한다..
[처음 삽질한 방법]
TreeNode.Nodes.Add("AAA");
TreeNode[] arrayTN = TreeNode.Nodes.Find("AAA", false);

뭘까..하고 이리저리 찾아보다보니..

TreeNode.Nodes.Add() 함수는 몇가지 오버로딩 함수를 가지는 데,

그 중,
1) TreeNode.Nodes.Add(string text);
2) TreeNode.Nodes.Add(string key, string text); 
두가지 함수의 차이에 대해 알아야 될 것 같다.

첫 삽질에서 사용 한 함수는 1) 함수이다.

그런데 Find 함수의 첫 인자인 key는 Node의 Name이라고 위 참조글에 적혀 있다.
TreeNode.Nodes.Add("AAA"); 는 1) 함수에 보면 key(Name)가 아니라 text이다.
 그래서 Name엔 기본값인 빈 문장("")이 들어가 있다.
결과적으로 Find로 찾는 Name값은 빈문장이기 때문에 "AAA"를 찾을 수 없다.

Find를 쓰려면 Node를 Add할 때 2) 함수로 추가를 해줘야 한다.
어차피 Text와 Name이 다를 필요가 없을 것 같아서 같게 해줬다.

[해결방법]
TreeNode.Nodes.Add("AAA", "AAA");
TreeNode.Nodes.Find("AAA", false);

P.s. Find 후 TreeNode[] 변수가  반환 되는데, 찾은 노드의 개수 판단은 Count가 아니라 Length 프로퍼티이다.
      (
Length가 0이면 찾는 항목이 없음.)

P.s.2 bool 
searchAllChildren 은 하위레벨 노드를 검색할 지 판단 변수이다. false로 하면 같은 레벨 노드에서만 검색을 한다.
        나는 같은 레벨에서 검색이 필요하기 때문에 false를 했다.

반응형

'Programming > C#' 카테고리의 다른 글

effective c# - 1  (0) 2011.11.29
TreeNode Visual C# 도구 설명을 추가하는 방법  (0) 2011.11.21
C# C++ COM Interop  (0) 2011.11.15
C#에서 포인터  (0) 2011.11.15
TreeView 이용하기(추가/선택삭제/체크삭제)  (0) 2011.11.14
Posted by blueasa
, |

전체 소스
     


특별히 설명이 필요 없을거 같습니다.





using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

 

namespace WATTreeView

{

    public partial class Form1 : Form

    {

        Random m_random = new Random(); // 랜덤인스턴스생성

        public Form1()

        {

            InitializeComponent();

        }

 

        private void Form1_Load(object senderEventArgs e)

        {

            treeView1.Nodes.Clear();

        }

 

        // 선택된노드에노드추가하기

        private void button1_Click(object senderEventArgs e)

        {

            TreeNode node = treeView1.SelectedNode;

            if (null == node)

                treeView1.Nodes.Add(m_random.Next(0, 100).ToString());

            else

            {

                node.Nodes.Add(m_random.Next(0, 100).ToString());

                node.Expand();

            }

        }

 

        // 선택노드삭제

        private void button2_Click(object senderEventArgs e)

        {

            TreeNode node = treeView1.SelectedNode;

            if (null != node)

            {

                node.Remove();

            }

        }

 

        // 체크된노드삭제

        private void btnDelCheck_Click(object senderEventArgs e)

        {

            foreach (TreeNode n in treeView1.Nodes)

            {

                if (n.Checkedn.Remove();

            }

        }

    }

}


출처 : 
http://pcsak3.com/48 

반응형

'Programming > C#' 카테고리의 다른 글

C# C++ COM Interop  (0) 2011.11.15
C#에서 포인터  (0) 2011.11.15
TreeView에서 Node 검색 및 카테고리 구현  (0) 2011.11.14
PropertyGrid 속성 값 가져오기(사용하기)  (0) 2011.11.02
PropertyGrid and Drop Down properties  (0) 2011.11.02
Posted by blueasa
, |

프로그래밍, C#, Web, TreeViewNode 검색, 카테고리 구현

갓 C#을 접하게된 어설픈 프로그래머 입니다. C#을 하면서 익힌 스킬을 공유하고자 합니다. 만약, 고쳐야할 부분이 있으면 알려주시면 감사하겠습니다. 

이번에 다룰 부분은 TreeView 입니다.

TreeView(트리뷰)는 가장 쉽게 얘기해서 Tistory의 카테고리를 표현하는 것처럼 그룹들을 보기 좋게 트리형태로 표현해 주는 컴포넌트입니다. 즉, 부모가 있고 부모 밑에는 자식이 있고 다시 손자가 있는 일종의 계층구조를 표시해 주는 것입니다.

Tistory의 카테고리를 표현하는 것도 일종의 TreeView 형태입니다. 당연히 C#에서 TreeView를 지원합니다. 

그럼 사용해봐야겠네요. (WebControls.TreeView 기준입니다.)

TrewView를 웹 폼에 추가를 합니다.(여기서는 이름을 trvGroup이라 명명하였습니다.)
//최상위 그룹을 생성합니다.  4Cs라고 가정합니다.
TreeNode trvNode = new TreeNode();
trvNode.Text ="4Cs";
trvNode.Value = "0";

// 4Cs라는 트리의 하부에 표현할 IT,종이접기,사는이야기 를 구성합니다.

//IT 항목 추가
TreeNode trvNodeIT = new TreeNode(); // TreeNode 인스턴스를 생성합니다. 이름은 trvNodeIT라고 하였습니다.
trvNodeIT.Text = "IT";                           // 트리뷰 상에 표시할 이름
trvNodeIT.Value = "01";                         // 구분할 값(프로그램을 내부에 사용할 값)
trvNode.ChildNodes.Add(trvNodeIT);     // 4Cs하부의 자식노드에 추가합니다.

// 종이접기 항목 추가
TreeNode trvNodeOrigami = new TreeNode();
trvNodeOrigami.Text = "종이접기";
trvNodeOrigami.Value = "02";
trvNode.ChildNodes.Add(trvNodeOrigami);

//사는이야기 항목 추가
TreeNode trvNodeLife = new TreeNode();
trvNodeLife.Text = "사는이야기";
trvNodeLife.Value = "03";
trvNode.ChildNodes.Add(trvNodeLife);

// 최종적으로 TreeView에 추가를 합니다.
trvGroup.Nodes.Add(trvNode);

위와 같이 한 후 실행을 하면 다음과 같이 표시됩니다. 

그런데 위와 같은 경우는 구조를 알고 있는 관계로 부모를 지정하고 추가를 하면 되지만 표현해야할 구조가 Database 등에서 읽어서 자동으로 표시해야할 경우는 사용할 수가 없습니다.

예로 Tistory의 개발자가 프로그램을 위와 같이 했다면, 프로그래머는 Tistory를 사용하는 블로그의 모든 구조를 확인하고 일일이 표시해야하는(?) 난감한 문제가 발생합니다.

물론, Microsoft사도 C#을 만들면서 자동으로 추가할 수 있는 무언가를 만들어 놓았겠죠. 찾아보시면 FindNode(string valuePath)라는 함수가 있습니다. 그런데 자세히 보시면 FindNode의 인자값이 valuePath라고 되어있습니다. valuePath는 TreeView에서 특정 Node가 위치한 일종의 경로를 나타냅니다. 

Default 구분자로 "/"를 사용합니다. 위의 예에서 종이접기라는 노드의 valuePath는 "부모의 value/종이접기의 value"로 구성되어 "0/02"가 됩니다. 즉, 종이접기 노드 하부에 자식 노드를 추가하기 위해서는 종이접기의 Value 뿐만 아니라 종이접기 부모의 value까지 알아야 한다는 결론입니다. 

낭패죠, FindNode를 사용하려면 미리 데이터 구조를 FindNode에 맞게 구성이 되어져야합니다.

결론은 함수를 만들어야합니다. 그것도 재귀호출함수를 만들어야 제대로 구성할 수가 있습니다. (물론, 데이터량이 많을 경우 속도에 문제가 발생할 수 있습니다.)

        // 최초 SearchNode를 호출합니다.
        // 오버로드 함수는 이름이 같으나 파라미터 등으로 구분해서 사용합니다.
        public void Disply_Tree(){
            string strParentKey;

            // 레코드에서 부모 Key를 가져옴
            strParentKey = rdr.GetInt32(0).ToString();   
            //Nodes 콜렉션과 부모 Key를 가지고 함수 호출
            TreeNode trParent = SearchNode(objTreeView.Nodes, strParantKey);  

            TreeNode trChild = new TreeNode(); 
             // 레코드에서 자신의 Key를 가져옴 (예, "02")
             trChild.Value = rdr.GetInt32(1).ToString();

             // 레코드에서 자신의 Node 이름을 가져옴 (예, "종이접기")
             trChild.Text = rdr.GetInt32(2).ToString();

             // 부모노드에 추가
             trParent.ChildNodes.Add(trChild);
        }

 //Tree 검색 - 재귀 호출 함수 (TreeView.Nodes,Key)
        public TreeNode SearchNode(TreeNodeCollection objNodes, string strKey)
        {
            // Nodes의 node를 가지고 찾을 때까지 반복합니다.
            foreach ( TreeNodnode in objNodes )
            {
                // 해당 Node를 찾을 경우 Node를 리턴합니다.
                if (node.Value == strKey) return node;

                // 없을 경우 하위 Nodes를 가지고 다시 SearchNode를 호출합니다.
                TreeNode findNode = SearchNode(node.ChildNodes,strKey);

                // 하위노드 검색 결과를 비교하여 Null이 아닐경우(찾은 경우) node를 리턴합니다.
                if ( findNode != null )
                        return findNode;
            }
            // 검색 결과 조건에 맞는 Node가 없을 경우 Null을 리턴합니다.
            return null;
        }

위와 같이 재귀함수를 통해서 아래와 같이 자동으로 트리를 구성할 수 있습니다.


프로그래밍에 도움이 되시길 바랍니다.

(알려드리지만 위의 방법은 본인의 주관적인 방법이며 만약, 다른 효과적인 방법이 있을 경우 공유해 주시면 감사하겠습니다.)

 
출처 : 
http://all4cs.tistory.com/31 
반응형
Posted by blueasa
, |

- 테이블에 자신의 키와 자기 부모의 키를 가지고 있는경우 재귀함수를 이용해 트리뷰를 구성

 

 

RwNm : 노드이름

RwCd : 노드키

PrntRw : 자신의 부모키

 

#region 트리뷰구성
private TreeNode CreateNode(string RwNm,string RwCd)
{
    //자신의 하위노드가 없을때까지 찾는다   

    TreeNode node = new TreeNode();
    node.Name = RwCd;
    node.Text = RwNm;

    foreach (DataRow r in RwCdTable.Rows)
    {
          if (RwCd == r["PrntRw"].ToString()) //자신의 키를 부모키로 갖고있는 노드검색
          {
              //System.Diagnostics.Debug.WriteLine(RwCd+ "->"+r["RwCd"].ToString());

              

              //재귀호출
              node.Nodes.Add(CreateNode(r["RwNm"].ToString(),

                                                        r["RwCd"].ToString()));                      
           }
     }
     return node; //자신의 하위노드를 다찾은 노드를 반환
}
#endregion

 

//함수사용

trvRw.Nodes.Add(CreateNode(strRwLevlNm,"00000000"));

 

자료구조시간에 배운 재귀함수를 회사에서 써먹게될줄이야...


출처 : http://blog.naver.com/tjr0807?Redirect=Log&logNo=150005240319

반응형
Posted by blueasa
, |
tree view에서 포커스가 사라질 때에도 선택된 트리 노드에서 강조 표시된 상태를 유지할지 여부를 나타내는 값을 가져오거나 설정합니다.


포커스를 잃었을 때 강조 표시가 되지 않는 모습
HideSelection = true; (default)



포커스를 잃었을 때 강조 표시가 되는 모습
HideSelection = false;



자세한 내용은 MSDN 참조
http://msdn.microsoft.com/ko-kr/library/system.windows.forms.treeview.hideselection.aspx


반응형
Posted by blueasa
, |

트리뷰 추가하기

treeView1.Nodes.Add("Main Server");             //노드 추가하기 0번째부터 시작!!

treeView1.Nodes[0].Nodes.Add("Main Server"); //0번째 노드에 자식노드 추가하기

 

트리뷰 삭제하기

treeView1.Nodes.RemoveAt(인덱스값_정수형);

 

하위 트리뷰까지 처음부터 활성화하기

treeView1.ExpandAll();

 

트리뷰 아이콘 넣기

 

ImageList myimageList = new ImageList();

myimageList.Images.Add(Image.FromFile(@"Clienticon_nateon.bmp"));//imageindex 0

myimageList.Images.Add(Image.FromFile(@"Clienticon_starc.bmp")); //imageindex 1

 

treeView1.ImageList = myimageList;

 

treeView1.Nodes.Add("Main Server");

treeView1.Nodes[0].ImageIndex = 1;   //트리뷰의 0번째의 이미지 설정

 

treeView1.Nodes[0].Nodes.Add("Node");

treeView1.ImageIndex = 0;            //트리뷰의 노드 전체의 이미지 설정

 



출처] [C#] 트리뷰(treeview) 추가(add),삭d제(remove), 아이콘(icon) 설정하기|작성자 한아랑

반응형
Posted by blueasa
, |

사용자 삽입 이미지
입력 배열 :

        string[] parentString = { "son1", "son2", "son3", "son4" };
        string[] childString = { "byoung1", "byoung2", "byoung3" };

입력방법 #1

        private void button1_Click(object sender, EventArgs e)
        {
            treeView1.Nodes.Clear();
            treeView1.BeginUpdate();

            foreach (string str in parentString)
            {
                TreeNode tn = treeView1.Nodes.Add(str);

                foreach (string substr in childString)
                {
                    tn.Nodes.Add(substr);
                }
            }

            treeView1.EndUpdate();
        }

입력방법 #2

        private void button2_Click(object sender, EventArgs e)
        {
            treeView1.Nodes.Clear();
            treeView1.BeginUpdate();

            foreach (string str in parentString)
            {
                treeView1.Nodes.Add(str);
            }

            foreach (TreeNode tn in treeView1.Nodes)
            {
                foreach (string substr in childString)
                {
                    tn.Nodes.Add(substr);
                }
            }

            treeView1.EndUpdate();
        }

입력방법 #3

        private void button3_Click(object sender, EventArgs e)
        {
            treeView1.Nodes.Clear();
            treeView1.BeginUpdate();

            TreeNode tn = new TreeNode();
            foreach (string str in childString)
            {
                tn.Nodes.Add(str);
            }

            foreach (string str in parentString)
            {
                TreeNode tnParent = treeView1.Nodes.Add(str);
            }

            treeView1.EndUpdate();
        }



출처 : http://www.iamgsi.com/entry/C-TreeView-내용-추가하기
반응형
Posted by blueasa
, |