Share via


TreeView-Klasse

Zeigt eine hierarchische Auflistung bezeichneter Elemente an, von denen jedes durch einen TreeNode dargestellt wird.

Namespace: System.Windows.Forms
Assembly: System.Windows.Forms (in system.windows.forms.dll)

Syntax

'Declaration
<ComVisibleAttribute(True)> _
<ClassInterfaceAttribute(ClassInterfaceType.AutoDispatch)> _
Public Class TreeView
    Inherits Control
'Usage
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

Hinweise

Die Nodes-Auflistung enthält alle TreeNode-Objekte, die dem TreeView-Steuerelement zugewiesen sind. Die Strukturknoten in dieser Auflistung werden als Stammknoten bezeichnet. Ein anschließend einem Stammknoten hinzugefügter Strukturknoten wird als untergeordneter Knoten bezeichnet. Da jeder TreeNode eine Auflistung anderer TreeNode-Objekte enthalten kann, ist es beim Durchlaufen der Struktur u. U. schwierig, Ihre Position in der Struktur zu bestimmen. Sie können die TreeNode.FullPath-Zeichenfolge analysieren, indem Sie mithilfe des PathSeparator-Zeichenfolgenwerts den Anfang und das Ende einer TreeNode-Bezeichnung bestimmen.

Sie können neben den Strukturknoten Bilder anzeigen lassen, indem Sie der ImageList-Eigenschaft eine ImageList zuweisen und für die Zuweisung dieses Image auf den Indexwert von Image in ImageList verweisen. Verwenden Sie die folgenden Eigenschaften, um Bilder zuzuweisen:

  • Legen Sie die ImageIndex-Eigenschaft auf den Indexwert des Image fest, das angezeigt werden soll, wenn ein Strukturknoten nicht ausgewählt ist.

  • Legen Sie die SelectedImageIndex-Eigenschaft auf den Indexwert des Image fest, das angezeigt werden soll, wenn ein Strukturknoten ausgewählt ist.

Die Bilder, auf die die Werte der ImageIndex-Eigenschaft und der SelectedImageIndex-Eigenschaft verweisen, sind die Standardbilder, die für alle der Nodes-Auflistung zugewiesenen Strukturknoten angezeigt werden. Einzelne Strukturknoten können die Standardbilder überschreiben, indem die TreeNode.ImageIndex-Eigenschaft und die TreeNode.SelectedImageIndex-Eigenschaft festgelegt werden.

Strukturknoten können erweitert werden, um die nächste Ebene von untergeordneten Strukturknoten anzuzeigen. Der Benutzer kann den TreeNode erweitern, indem er auf die Schaltfläche mit dem Pluszeichen (+) klickt, sofern diese neben dem TreeNode angezeigt wird. Der TreeNode kann auch durch Aufrufen der TreeNode.Expand-Methode erweitert werden. Wenn Sie alle Ebenen von untergeordneten Strukturknoten in der Nodes-Auflistung erweitern möchten, rufen Sie die ExpandAll-Methode auf. Sie können die untergeordnete TreeNode-Ebene reduzieren, indem Sie die TreeNode.Collapse-Methode aufrufen. Sie können aber auch auf die Schaltfläche mit dem Minuszeichen (-) klicken, sofern diese neben dem TreeNode angezeigt wird. Zudem kann die TreeNode.Toggle-Methode aufgerufen werden, um zwischen dem erweiterten und dem reduzierten Zustand zu wechseln.

Strukturknoten können optional Kontrollkästchen anzeigen. Um die Kontrollkästchen anzuzeigen, legen Sie die CheckBoxes-Eigenschaft der TreeView auf true fest. Die Checked-Eigenschaft wird für Strukturknoten im aktivierten Zustand auf true festgelegt.

Hinweis

Durch Festlegen der TreeNode.Checked-Eigenschaft im BeforeCheck-Ereignis oder im AfterCheck-Ereignis wird das Ereignis mehrmals ausgelöst. Dies kann zu unerwartetem Verhalten führen. Beispielsweise können Sie die Checked-Eigenschaft im Ereignishandler beim rekursiven Aktualisieren der untergeordneten Knoten festlegen, sodass der Benutzer die Knoten nicht einzeln erweitern und aktivieren muss. Wenn verhindert werden soll, dass das Ereignis mehrmals ausgelöst wird, fügen Sie dem Ereignishandler Logik hinzu, die den rekursiven Code nur dann ausführt, wenn die Action-Eigenschaft der Instanz von TreeViewEventArgs nicht auf TreeViewAction.Unknown festgelegt ist. Ein entsprechendes Beispiel zur Vorgehensweise finden Sie im Beispielabschnitt des AfterCheck-Ereignisses und des BeforeCheck-Ereignisses.

Sie können die Darstellung des TreeView-Steuerelements ändern, indem Sie einige zugehörige Anzeige- und Stileigenschaften festlegen. Wenn Sie ShowPlusMinus auf true festlegen, wird neben jeder erweiterbaren bzw. reduzierbaren TreeNode eine Schaltfläche mit einem Plus- bzw. Minuszeichen angezeigt. Wenn Sie die ShowRootLines-Eigenschaft auf true festlegen, werden in der TreeView Verbindungslinien zwischen allen Stammknoten angezeigt. Sie können Verbindungslinien zwischen untergeordneten Knoten und dem zugehörigen Stammknoten anzeigen, indem Sie die ShowLines-Eigenschaft auf true festlegen. Wenn Sie die HotTracking-Eigenschaft auf true festlegen, ändert sich die Darstellung der Strukturknotenbezeichnung, wenn der Mauszeiger darüber bewegt wird. Beim Hot-Tracking werden die Strukturknotenbezeichnungen als Hyperlinks dargestellt. Sie können auch die Darstellung des TreeView-Steuerelements vollständig anpassen. Dazu legen Sie die DrawMode-Eigenschaft auf einen anderen Wert als TreeViewDrawMode.Normal fest und bearbeiten das DrawNode-Ereignis.

Hinweis

Wenn die Eigenschaften CheckBoxes, Scrollable, ImageIndex und SelectedImageIndex zur Laufzeit festgelegt werden, wird das TreeView-Handle neu erstellt (siehe Control.RecreateHandle), um die Darstellung des Steuerelements zu aktualisieren. Dadurch werden alle Strukturknoten mit Ausnahme des ausgewählten TreeNode reduziert.

Beispiel

Im folgenden Codebeispiel wird die Verwendung des TreeView-Steuerelement veranschaulicht.

' 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();
}

Im folgenden komplexeren Codebeispiel werden Kundeninformationen in einem TreeView-Steuerelement angezeigt. Die Stammknoten zeigen die Namen der Kunden an, die untergeordneten Knoten zeigen die dem jeweiligen Kunden zugewiesenen Auftragsnummern an. In diesem Beispiel werden 1.000 Kunden mit jeweils 15 Aufträgen angezeigt. Das Neuaufbauen der TreeView wird mithilfe der BeginUpdate-Methode und der EndUpdate-Methode unterdrückt, und es wird ein Warte-Cursor angezeigt, solange die TreeNode-Objekte in der TreeView erstellt und gezeichnet werden. Für dieses Beispiel muss ein Customer-Objekt vorhanden sein, das eine Auflistung von Order-Objekten enthalten kann. Darüber hinaus ist es erforderlich, dass im Anwendungsverzeichnis die Cursordatei MyWait.cur vorhanden ist und eine Instanz eines TreeView-Steuerelements im Form erstellt wurde.

' 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

Vererbungshierarchie

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

Threadsicherheit

Alle öffentlichen statischen (Shared in Visual Basic) Member dieses Typs sind threadsicher. Bei Instanzmembern ist die Threadsicherheit nicht gewährleistet.

Plattformen

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

.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen.

Versionsinformationen

.NET Framework

Unterstützt in: 2.0, 1.1, 1.0

.NET Compact Framework

Unterstützt in: 2.0, 1.0

Siehe auch

Referenz

TreeView-Member
System.Windows.Forms-Namespace
TreeNode-Klasse