다음을 통해 공유


TreeView 클래스

각각 TreeNode로 표시되는 레이블이 붙은 항목의 계층적 컬렉션을 표시합니다.

네임스페이스: System.Windows.Forms
어셈블리: System.Windows.Forms(system.windows.forms.dll)

구문

‘선언
<ComVisibleAttribute(True)> _
<ClassInterfaceAttribute(ClassInterfaceType.AutoDispatch)> _
Public Class TreeView
    Inherits Control
‘사용 방법
Dim instance As TreeView
[ComVisibleAttribute(true)] 
[ClassInterfaceAttribute(ClassInterfaceType.AutoDispatch)] 
public class TreeView : Control
[ComVisibleAttribute(true)] 
[ClassInterfaceAttribute(ClassInterfaceType::AutoDispatch)] 
public ref class TreeView : public Control
/** @attribute ComVisibleAttribute(true) */ 
/** @attribute ClassInterfaceAttribute(ClassInterfaceType.AutoDispatch) */ 
public class TreeView extends Control
ComVisibleAttribute(true) 
ClassInterfaceAttribute(ClassInterfaceType.AutoDispatch) 
public class TreeView extends Control

설명

Nodes 컬렉션은 TreeView 컨트롤에 지정된 모든 TreeNode 개체를 보유합니다. 이 컬렉션의 트리 노드를 루트 트리 노드라고 합니다. 나중에 루트 트리 노드에 추가된 트리 노드를 자식 노드라고 합니다. 각 TreeNode에 다른 TreeNode 개체의 컬렉션이 포함될 수 있으므로 컬렉션 전체를 반복할 때 트리 구조에서 사용자의 위치를 확인하는 것이 어려울 수 있습니다. PathSeparator 문자열 값을 통해 TreeNode.FullPath 문자열의 구문을 분석하여 TreeNode 레이블이 시작되는 위치와 끝나는 위치를 확인할 수 있습니다.

ImageListImageList 속성에 할당하고 해당 Image를 할당할 ImageListImage에 대한 인덱스 값을 참조하여 트리 노드 옆에 이미지를 표시할 수 있습니다. 다음 속성을 사용하여 이미지를 할당합니다.

  • ImageIndex 속성을 트리 노드가 선택되지 않았을 때 표시할 Image의 인덱스 값으로 설정합니다.

  • SelectedImageIndex 속성을 트리 노드가 선택되었을 때 표시할 Image의 인덱스 값으로 설정합니다.

ImageIndexSelectedImageIndex 속성 값에서 참조하는 이미지는 Nodes 컬렉션에 지정된 모든 트리 노드에 표시된 기본 이미지입니다. 개별 트리 노드에서는 TreeNode.ImageIndexTreeNode.SelectedImageIndex 속성을 설정하여 기본 이미지를 재정의할 수 있습니다.

다음 수준의 자식 트리 노드를 표시하도록 트리 노드를 확장할 수 있습니다. TreeNode 옆에 더하기 기호(+)가 있는 경우 이 기호를 클릭하여 TreeNode를 확장하거나 TreeNode.Expand 메서드를 호출하여 TreeNode를 확장할 수 있습니다. Nodes 컬렉션에 있는 모든 자식 트리 노드 수준을 확장하려면 ExpandAll 메서드를 호출합니다. TreeNode.Collapse 메서드를 호출하여 자식 TreeNode 수준을 축소하거나 TreeNode 옆에 빼기 기호(-) 단추가 있는 경우 이 단추를 누를 수 있습니다. 또한 TreeNode.Toggle 메서드를 호출하여 확장된 상태와 축소된 상태 사이에서 전환할 수 있습니다.

트리 노드에 선택적으로 확인란을 표시할 수 있습니다. 확인란을 표시하려면 TreeViewCheckBoxes 속성을 true로 설정합니다. 선택 상태에 있는 트리 노드의 경우 Checked 속성이 true로 설정됩니다.

참고

BeforeCheck 또는 AfterCheck 이벤트 내에서 TreeNode.Checked 속성을 설정하면 이벤트가 여러 번 발생하여 예상하지 못한 동작이 생길 수 있습니다. 예를 들어, 자식 노드를 반복적으로 업데이트하는 경우 이벤트 처리기에서 Checked 속성을 설정하면 사용자가 각 노드를 개별적으로 확장하여 선택할 필요가 없습니다. TreeViewEventArgsAction 속성이 TreeViewAction.Unknown으로 설정되어 있지 않은 경우, 이벤트가 여러 번 발생하지 않도록 하려면 재귀적 코드만 실행하는 이벤트 처리기에 논리를 추가합니다. 이러한 방법의 예제를 보려면 AfterCheck 또는 BeforeCheck 이벤트의 예제 단원을 참조하십시오.

표시 및 스타일 속성 일부를 설정하여 TreeView 컨트롤의 모양을 변경할 수 있습니다. ShowPlusMinustrue로 설정하면 확장하거나 축소할 수 있는 각 TreeNode 옆에 더하기 기호 또는 빼기 기호 단추가 각각 표시됩니다. ShowRootLines 속성을 true로 설정하면 TreeView에서는 모든 루트 트리 노드를 연결하는 선을 표시합니다. ShowLines 속성을 true로 설정하여 자식 트리 노드를 해당 루트 노드에 연결하는 선을 표시할 수 있습니다. HotTracking 속성을 true로 설정하면 마우스 포인터가 지나갈 때 트리 노드 레이블의 모양이 달라집니다. 핫 트래킹 중에는 트리 노드 레이블이 하이퍼링크 모양을 취합니다. TreeView 컨트롤의 모양을 완전히 사용자 지정할 수도 있습니다. 이렇게 하려면 DrawMode 속성 값을 TreeViewDrawMode.Normal 이외의 다른 값으로 설정하고 DrawNode 이벤트를 처리합니다.

참고

런타임에 CheckBoxes, Scrollable, ImageIndexSelectedImageIndex 속성을 설정하면 컨트롤의 모양을 업데이트하도록 TreeView 핸들이 다시 만들어집니다(Control.RecreateHandle 참조). 이 경우 선택된 TreeNode를 제외하고 모든 트리 노드가 축소됩니다.

예제

다음 코드 예제에서는 TreeView 컨트롤을 사용하는 방법을 보여 줍니다.

' Populates a TreeView control with example nodes. 
Private Sub InitializeTreeView()
    treeView1.BeginUpdate()
    treeView1.Nodes.Add("Parent")
    treeView1.Nodes(0).Nodes.Add("Child 1")
    treeView1.Nodes(0).Nodes.Add("Child 2")
    treeView1.Nodes(0).Nodes(1).Nodes.Add("Grandchild")
    treeView1.Nodes(0).Nodes(1).Nodes(0).Nodes.Add("Great Grandchild")
    treeView1.EndUpdate()
End Sub
// Populates a TreeView control with example nodes. 
private void InitializeTreeView()
{
    treeView1.BeginUpdate();
    treeView1.Nodes.Add("Parent");
    treeView1.Nodes[0].Nodes.Add("Child 1");
    treeView1.Nodes[0].Nodes.Add("Child 2");
    treeView1.Nodes[0].Nodes[1].Nodes.Add("Grandchild");
    treeView1.Nodes[0].Nodes[1].Nodes[0].Nodes.Add("Great Grandchild");
    treeView1.EndUpdate();
}

다음의 복잡한 코드 예제에서는 TreeView 컨트롤에 고객 정보를 표시합니다. 루트 트리 노드에는 고객 이름이 표시되고 자식 트리 노드에는 각 고객에게 할당된 주문 번호가 표시됩니다. 이 예제에서는 주문을 15개씩 보유하고 있는 1000명의 고객이 표시됩니다. BeginUpdateEndUpdate 메서드를 사용하여 TreeView의 다시 그리기가 억제되고 TreeView에서 TreeNode 개체를 만들고 그리는 동안 대기 중인 Cursor가 표시됩니다. 이 예제를 실행하려면 Order 개체의 컬렉션을 저장할 수 있는 Customer 개체가 있어야 합니다. 또한 응용 프로그램 디렉터리에 MyWait.cur라는 커서 파일이 있고, Form에서 TreeView 컨트롤의 인스턴스가 만들어진 상태여야 합니다.

' Create a new ArrayList to hold the Customer objects.
Private customerArray As New ArrayList()

Private Sub FillMyTreeView()
   ' Add customers to the ArrayList of Customer objects.
   Dim x As Integer
   For x = 0 To 999
      customerArray.Add(New Customer("Customer" + x.ToString()))
   Next x

   ' Add orders to each Customer object in the ArrayList.
   Dim customer1 As Customer
   For Each customer1 In customerArray
      Dim y As Integer
      For y = 0 To 14
         customer1.CustomerOrders.Add(New Order("Order" + y.ToString()))
      Next y
   Next customer1

   ' Display a wait cursor while the TreeNodes are being created.
   Cursor.Current = New Cursor("MyWait.cur")

   ' Suppress repainting the TreeView until all the objects have been created.
   treeView1.BeginUpdate()

   ' Clear the TreeView each time the method is called.
   treeView1.Nodes.Clear()

   ' Add a root TreeNode for each Customer object in the ArrayList.
   Dim customer2 As Customer
   For Each customer2 In customerArray
      treeView1.Nodes.Add(New TreeNode(customer2.CustomerName))

      ' Add a child TreeNode for each Order object in the current Customer object.
      Dim order1 As Order
      For Each order1 In customer2.CustomerOrders
         treeView1.Nodes(customerArray.IndexOf(customer2)).Nodes.Add( _
    New TreeNode(customer2.CustomerName + "." + order1.OrderID))
      Next order1
   Next customer2

   ' Reset the cursor to the default for all controls.
   Cursor.Current = System.Windows.Forms.Cursors.Default

   ' Begin repainting the TreeView.
   treeView1.EndUpdate()
End Sub 'FillMyTreeView
// Create a new ArrayList to hold the Customer objects.
private ArrayList customerArray = new ArrayList(); 

private void FillMyTreeView()
{
   // Add customers to the ArrayList of Customer objects.
   for(int x=0; x<1000; x++)
   {
      customerArray.Add(new Customer("Customer" + x.ToString()));
   }

   // Add orders to each Customer object in the ArrayList.
   foreach(Customer customer1 in customerArray)
   {
      for(int y=0; y<15; y++)
      {
         customer1.CustomerOrders.Add(new Order("Order" + y.ToString()));    
      }
   }

   // Display a wait cursor while the TreeNodes are being created.
   Cursor.Current = new Cursor("MyWait.cur");
        
   // Suppress repainting the TreeView until all the objects have been created.
   treeView1.BeginUpdate();

   // Clear the TreeView each time the method is called.
   treeView1.Nodes.Clear();

   // Add a root TreeNode for each Customer object in the ArrayList.
   foreach(Customer customer2 in customerArray)
   {
      treeView1.Nodes.Add(new TreeNode(customer2.CustomerName));
          
      // Add a child treenode for each Order object in the current Customer object.
      foreach(Order order1 in customer2.CustomerOrders)
      {
         treeView1.Nodes[customerArray.IndexOf(customer2)].Nodes.Add(
           new TreeNode(customer2.CustomerName + "." + order1.OrderID));
      }
   }

   // Reset the cursor to the default for all controls.
   Cursor.Current = Cursors.Default;

   // Begin repainting the TreeView.
   treeView1.EndUpdate();
}
void FillMyTreeView()
{
   // Add customers to the ArrayList of Customer objects.
   for ( int x = 0; x < 1000; x++ )
   {
      customerArray->Add( gcnew Customer( "Customer " + x ) );
   }
   
   // Add orders to each Customer object in the ArrayList.
   IEnumerator^ myEnum = customerArray->GetEnumerator();
   while ( myEnum->MoveNext() )
   {
      Customer^ customer1 = safe_cast<Customer^>(myEnum->Current);
      for ( int y = 0; y < 15; y++ )
      {
         customer1->CustomerOrders->Add( gcnew Order( "Order " + y ) );
      }
   }

   // Display a wait cursor while the TreeNodes are being created.
   ::Cursor::Current = gcnew System::Windows::Forms::Cursor( "MyWait.cur" );
   
   // Suppress repainting the TreeView until all the objects have been created.
   treeView1->BeginUpdate();
   
   // Clear the TreeView each time the method is called.
   treeView1->Nodes->Clear();
   
   // Add a root TreeNode for each Customer object in the ArrayList.
   while ( myEnum->MoveNext() )
   {
      Customer^ customer2 = safe_cast<Customer^>(myEnum->Current);
      treeView1->Nodes->Add( gcnew TreeNode( customer2->CustomerName ) );
      
      // Add a child treenode for each Order object in the current Customer object.
      IEnumerator^ myEnum = customer2->CustomerOrders->GetEnumerator();
      while ( myEnum->MoveNext() )
      {
         Order^ order1 = safe_cast<Order^>(myEnum->Current);
         treeView1->Nodes[ customerArray->IndexOf( customer2 ) ]->Nodes->Add( gcnew TreeNode( customer2->CustomerName + "." + order1->OrderID ) );
      }
   }
   
   // Reset the cursor to the default for all controls.
   ::Cursor::Current = Cursors::Default;
   
   // Begin repainting the TreeView.
   treeView1->EndUpdate();
}
// Create a new ArrayList to hold the Customer objects.
private ArrayList customerArray = new ArrayList();

private void FillMyTreeView()
{
    // Add customers to the ArrayList of Customer objects.
    for (int x = 0; x < 1000; x++) {
        customerArray.Add(new Customer("Customer"
            + ((Int32)x).ToString()));
    }
    // Add orders to each Customer object in the ArrayList.
    for (int iCtr = 0; iCtr < customerArray.get_Count(); iCtr++) {
        Customer customer1 = (Customer)customerArray.get_Item(iCtr);
        for (int y = 0; y < 15; y++) {
            customer1.get_CustomerOrders().Add(new Order("Order"
                + ((Int32)y).ToString()));
        }
    }
    // Display a wait cursor while the TreeNodes are being created.
    get_Cursor().set_Current(new Cursor("MyWait.cur"));
    // Suppress repainting the TreeView until all the objects have
    // been created.
    treeView1.BeginUpdate();
    // Clear the TreeView each time the method is called.
    treeView1.get_Nodes().Clear();
    // Add a root TreeNode for each Customer object in the ArrayList.
    for (int iCtr1 = 0; iCtr1 < customerArray.get_Count(); iCtr1++) {
        Customer customer2 = (Customer)customerArray.get_Item(iCtr1);
        treeView1.get_Nodes().Add(new TreeNode(customer2.get_CustomerName()));
        // Add a child treenode for each Order object in the current
        // Customer object.
        for (int iCtr2 = 0; iCtr2 < customer2.get_CustomerOrders().
            get_Count(); iCtr2++) {
            Order order1 = (Order)customer2.get_CustomerOrders().
                get_Item(iCtr2);
            treeView1.get_Nodes().
                get_Item(customerArray.IndexOf(customer2)).get_Nodes().
                Add(new TreeNode(customer2.get_CustomerName() + "."
                + order1.get_OrderID()));
        }
    }
    // Reset the cursor to the default for all controls.
    get_Cursor().set_Current(Cursors.get_Default());
    // Begin repainting the TreeView.
    treeView1.EndUpdate();
} //FillMyTreeView

상속 계층 구조

System.Object
   System.MarshalByRefObject
     System.ComponentModel.Component
       System.Windows.Forms.Control
        System.Windows.Forms.TreeView
           System.ComponentModel.Design.ObjectSelectorEditor.Selector

스레드로부터의 안전성

이 형식의 모든 public static(Visual Basic의 경우 Shared) 멤버는 스레드로부터 안전합니다. 인터페이스 멤버는 스레드로부터 안전하지 않습니다.

플랫폼

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework에서 모든 플래폼의 모든 버전을 지원하지는 않습니다. 지원되는 버전의 목록은 시스템 요구 사항을 참조하십시오.

버전 정보

.NET Framework

2.0, 1.1, 1.0에서 지원

.NET Compact Framework

2.0, 1.0에서 지원

참고 항목

참조

TreeView 멤버
System.Windows.Forms 네임스페이스
TreeNode 클래스