(0) exportieren Drucken
Alle erweitern

HierarchicalDataBoundControl-Klasse

Fungiert als Basisklasse für alle datengebundenen Steuerelemente von ASP.NET, Version 2.0, deren Daten in hierarchischer Form angezeigt werden.

Namespace: System.Web.UI.WebControls
Assembly: System.Web (in system.web.dll)

public abstract class HierarchicalDataBoundControl : BaseDataBoundControl
public abstract class HierarchicalDataBoundControl extends BaseDataBoundControl
public abstract class HierarchicalDataBoundControl extends BaseDataBoundControl
Nicht zutreffend.

Bei der HierarchicalDataBoundControl-Klasse handelt es sich um die für ASP.NET-Steuerelemente verwendete Basisklasse, die Daten aus einem hierarchischen ASP.NET-Datenquellen-Steuerelement abruft und Elemente der Benutzeroberfläche des Steuerelements an die Daten für die Anzeige bindet. Die TreeView-Klasse und die Menu-Klasse werden vom HierarchicalDataBoundControl abgeleitet.

Seitenentwickler verwenden die HierarchicalDataBoundControl-Klasse nicht direkt, sondern verwenden stattdessen von dieser Klasse abgeleitete Steuerelemente.

Seitenentwickler erweitern diese Klasse zum Erstellen datengebundener Steuerelemente, die Klassen verwenden, die die IHierarchicalDataSource-Schnittstelle implementieren sowie Klassen, die von der HierarchicalDataSourceControl-Klasse und der HierarchicalDataSourceView-Klasse abgeleitet sind. Überschreiben Sie beim Ableiten einer Klasse von der HierarchicalDataBoundControl-Klasse die PerformDataBinding-Methode, um die Elemente der Benutzeroberfläche des Steuerelements an die von der GetData-Methode abgerufenen Daten zu binden. In den meisten Fällen ist die PerformDataBinding-Methode die einzige Methode, die in der abgeleiteten Klasse überschrieben wird.

Für datengebundene ASP.NET 2.0-Steuerelemente entspricht die PerformSelect-Methode der DataBind-Methode. Sie wird aufgerufen, um Daten zur Laufzeit zu binden. Die PerformSelect-Methode ruft die GetData-Methode und die PerformDataBinding-Methode auf.

Im folgenden Codebeispiel wird veranschaulicht, wie eine Klasse von der HierarchicalDataBoundControl-Klasse abgeleitet wird, um ein benutzerdefiniertes datengebundenes Steuerelement zu erstellen. Das GeneologyTree-Steuerelement gib einen pre-HTML-Abschnitt mit einer Textstruktur für die Daten wieder, die von einem zugeordneten Datenquellen-Steuerelement abgerufen wurden.

using System;
using System.Collections;
using System.ComponentModel;
using System.Security.Permissions;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Samples.AspNet.CS.Controls {

    [AspNetHostingPermission(SecurityAction.Demand, 
        Level=AspNetHostingPermissionLevel.Minimal)]
    [AspNetHostingPermission(SecurityAction.InheritanceDemand, 
        Level=AspNetHostingPermissionLevel.Minimal)]
    public class GeneologyTree : HierarchicalDataBoundControl {

        private TreeNode rootNode;
        public TreeNode RootNode {
            get {
                if (rootNode == null) {
                    rootNode = new TreeNode(String.Empty);
                }
                return rootNode;
            }
        }
        
        private ArrayList nodes;
        public ArrayList Nodes {
            get {
                if (null == nodes) {
                    nodes = new ArrayList();
                }
                return nodes;
            }
        }
        public string DataTextField {
            get {
                object o = ViewState["DataTextField"];
                return((o == null) ? string.Empty : (string)o);
            }
            set {
                ViewState["DataTextField"] = value;
                if (Initialized) {
                    OnDataPropertyChanged();
                }
            }
        }
        private int _maxDepth = 0;
        protected override void PerformDataBinding() {
            base.PerformDataBinding();

            // Do not attempt to bind data if there is no
            // data source set.
            if (!IsBoundUsingDataSourceID && (DataSource == null)) {
                return;
            }
            
            HierarchicalDataSourceView view = GetData(RootNode.DataPath);
            
            if (view == null) {
                throw new InvalidOperationException
                    ("No view returned by data source control.");
            }                                  
            
            IHierarchicalEnumerable enumerable = view.Select();
            if (enumerable != null) {
                            
                Nodes.Clear();
                                
                try {
                    RecurseDataBindInternal(RootNode, enumerable, 1);
                }
                finally {
                
                }
            }
        }
        private void RecurseDataBindInternal(TreeNode node, 
            IHierarchicalEnumerable enumerable, int depth) {                                    
                        
            foreach(object item in enumerable) {
                IHierarchyData data = enumerable.GetHierarchyData(item);

                if (null != data) {
                    // Create an object that represents the bound data
                    // to the control.
                    TreeNode newNode = new TreeNode();
                    RootViewNode rvnode = new RootViewNode();
                    
                    rvnode.Node = newNode;
                    rvnode.Depth = depth;

                    // The dataItem is not just a string, but potentially
                    // an XML node or some other container. 
                    // If DataTextField is set, use it to determine which 
                    // field to render. Otherwise, use the first field.                    
                    if (DataTextField.Length > 0) {
                        newNode.Text = DataBinder.GetPropertyValue
                            (data, DataTextField, null);
                    }
                    else {
                        PropertyDescriptorCollection props = 
                            TypeDescriptor.GetProperties(data);

                        // Set the "default" value of the node.
                        newNode.Text = String.Empty;                        

                        // Set the true data-bound value of the TextBox,
                        // if possible.
                        if (props.Count >= 1) {                        
                            if (null != props[0].GetValue(data)) {
                                newNode.Text = 
                                    props[0].GetValue(data).ToString();
                            } 
                        }
                    }

                    Nodes.Add(rvnode);                    
                    
                    if (data.HasChildren) {
                        IHierarchicalEnumerable newEnumerable = 
                            data.GetChildren();
                        if (newEnumerable != null) {                            
                            RecurseDataBindInternal(newNode, 
                                newEnumerable, depth+1 );
                        }
                    }
                    
                    if ( _maxDepth < depth) _maxDepth = depth;
                    
                }
            }
        }
        protected override void Render(HtmlTextWriter writer) {
                        
            writer.WriteLine("<PRE>");                        
            int currentDepth = 1;
            int currentTextLen = 0;
            
            foreach (RootViewNode rvnode in Nodes) {
                if (rvnode.Depth == currentDepth) {
                    string output = "  " + rvnode.Node.Text + "  ";
                    writer.Write(output);
                    currentTextLen = currentTextLen + output.Length;
                }
                else {
                    writer.WriteLine("");
                    // Some very basic whitespace formatting
                    int halfLine = currentTextLen / 2;
                    for (int i=0;i<halfLine;i++) {
                        writer.Write(' ');
                    }
                    writer.Write('|');
                    writer.WriteLine("");
                    ++currentDepth; 
                    currentTextLen = 0;
                    for (int j=0;j<halfLine;j++) {
                        writer.Write(' ');
                    }
                    string output = "  " + rvnode.Node.Text + "  ";
                    writer.Write(output);
                    currentTextLen = currentTextLen + output.Length;                    
                }                                                           
            }
            writer.WriteLine("</PRE>");
        }
        
        private class RootViewNode { 
            public TreeNode Node;
            public int Depth;
        }
    }
}

Im folgenden Codebeispiel wird veranschaulicht, wie das im vorherigen Beispiel definierte GeneologyTree-Steuerelement verwendet und an ein XmlDataSource-Steuerelement gebunden wird.

<%@Page language="c#" %>
<%@ Register TagPrefix="aspSample" 
    Namespace="Samples.AspNet.CS.Controls" 
    Assembly="Samples.AspNet.CS.Controls" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
  <head>
    <title>C# Example</title>
  </head>

  <body>
    <form id="Form1" method="post" runat="server">

        <aspSample:geneologytree
          id="GeneologyTree1"
          runat="server"
          datatextfield="title"
          datasourceid="XmlDataSource1" />

        <asp:xmldatasource
          id="XmlDataSource1"
          datafile="geneology.xml"          
          runat="server" />
          
    </form>
  </body>
</html>

Die Datei geneology.xml, auf die im Codebeispiel zugegriffen wird, enthält die folgenden Daten:

<family>
  <member title="great-grandfather">
    <member title="grandfather" >
      <member title="child" />
      <member title="father" >
         <member title="son" />
      </member>
    </member>
  </member>
</family>

System.Object
   System.Web.UI.Control
     System.Web.UI.WebControls.WebControl
       System.Web.UI.WebControls.BaseDataBoundControl
        System.Web.UI.WebControls.HierarchicalDataBoundControl
           System.Web.UI.WebControls.Menu
           System.Web.UI.WebControls.TreeView

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

Windows 98, Windows Server 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

Microsoft .NET Framework 3.0 wird unter Windows Vista, Microsoft Windows XP SP2 und Windows Server 2003 SP1 unterstützt.

.NET Framework

Unterstützt in: 3.0, 2.0
Anzeigen:
© 2014 Microsoft