Esporta (0) Stampa
Espandi tutto

Classe HierarchicalDataBoundControl

Aggiornamento: novembre 2007

Utilizzato come classe base per tutti i controlli con associazione a dati di ASP.NET versione 2.0 che visualizzano i dati in forma gerarchica.

Spazio dei nomi:  System.Web.UI.WebControls
Assembly:  System.Web (in System.Web.dll)

[AspNetHostingPermissionAttribute(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
[AspNetHostingPermissionAttribute(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
public abstract class HierarchicalDataBoundControl : BaseDataBoundControl
/** @attribute AspNetHostingPermissionAttribute(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal) */
/** @attribute AspNetHostingPermissionAttribute(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal) */
public abstract class HierarchicalDataBoundControl extends BaseDataBoundControl
public abstract class HierarchicalDataBoundControl extends BaseDataBoundControl
<asp:HierarchicalDataBoundControl />

La classe HierarchicalDataBoundControl è la classe base utilizzata per i controlli ASP.NET che recuperano i dati in formato gerarchico da un controllo di origine dati ASP.NET e associano a quei dati elementi dell'interfaccia utente del controllo per la visualizzazione. Le classi TreeView e Menu derivano dalla classe HierarchicalDataBoundControl.

Gli sviluppatori di pagine non utilizzano direttamente la classe HierarchicalDataBoundControl; utilizzano, invece, controlli che derivano da questa classe.

Gli sviluppatori di controlli estendono questa classe per creare controlli con associazione a dati che funzionano con classi che implementano l'interfaccia IHierarchicalDataSource e classi che derivano dalle classi HierarchicalDataSourceControl e HierarchicalDataSourceView. Quando si deriva una classe dalla classe HierarchicalDataBoundControl, eseguire l'override del metodo PerformDataBinding per associare gli elementi dell'interfaccia utente del controllo in uso ai dati recuperati dal metodo GetData. Nella maggior parte dei casi, il metodo PerformDataBinding è l'unico ad essere sottoposto a override nella classe derivata in uso.

Per i controlli con associazione a dati di ASP.NET 2.0, il metodo PerformSelect equivale al metodo DataBind e viene chiamato per associare i dati in fase di esecuzione. Il metodo PerformSelect chiama i metodi GetData e PerformDataBinding.

Nell'esempio di codice riportato di seguito viene illustrato come derivare una classe dalla classe HierarchicalDataBoundControl per creare un controllo con associazione a dati personalizzato. Il controllo GeneologyTree consente di eseguire il rendering di una sezione pre HTML con una struttura di testo per i dati recuperati da un controllo origine dati associato.

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;
        }
    }
}


Nell'esempio di codice riportato di seguito viene illustrato come utilizzare il controllo GeneologyTree definito nell'esempio precedente e associarlo a un controllo XmlDataSource.

<%@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>


Il file geneology.xml dell'esempio di codice contiene i dati riportati di seguito.

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

Qualsiasi membro static (Shared in Visual Basic) pubblico di questo tipo è thread-safe. I membri di istanza non sono garantiti come thread-safe.

Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition , Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98

.NET Framework e .NET Compact Framework non supportano tutte le versioni di ciascuna piattaforma. Per un elenco delle versioni supportate, vedere Requisiti di sistema di .NET Framework.

.NET Framework

Supportato in: 3.5, 3.0, 2.0

Aggiunte alla community

AGGIUNGI
Mostra:
© 2014 Microsoft