이 설명서는 보관되지만 유지 되지 않습니다.

HierarchicalDataBoundControl 클래스

계층적 폼에 데이터를 표시하는 ASP.NET 버전 2.0의 데이터 바인딩된 모든 컨트롤에 대한 기본 클래스 역할을 합니다.

네임스페이스: System.Web.UI.WebControls
어셈블리: System.Web(system.web.dll)

public abstract class HierarchicalDataBoundControl : BaseDataBoundControl
public abstract class HierarchicalDataBoundControl extends BaseDataBoundControl
public abstract class HierarchicalDataBoundControl extends BaseDataBoundControl
적용할 수 없음.

HierarchicalDataBoundControl 클래스는 ASP.NET의 계층적 데이터 소스 컨트롤에서 데이터를 검색하고 표시를 위해 해당 데이터에 컨트롤의 사용자 인터페이스 요소를 바인딩하는 ASP.NET 컨트롤에 사용되는 기본 클래스입니다. TreeViewMenu 클래스는 HierarchicalDataBoundControl에서 파생됩니다.

페이지 개발자는 HierarchicalDataBoundControl 클래스를 직접 사용하지 않고 이 클래스에서 파생되는 컨트롤을 대신 사용합니다.

컨트롤 개발자는 이 클래스를 확장하여 IHierarchicalDataSource 인터페이스를 구현하는 클래스와 HierarchicalDataSourceControlHierarchicalDataSourceView 클래스에서 파생되는 클래스에서 작동하는 데이터 바인딩된 컨트롤을 만듭니다. HierarchicalDataBoundControl 클래스에서 클래스를 파생시키는 경우 PerformDataBinding 메서드를 재정의하여 컨트롤의 사용자 인터페이스 요소를 GetData 메서드에서 검색한 데이터에 바인딩합니다. 대부분의 경우 PerformDataBinding 메서드만 파생 클래스에서 재정의합니다.

ASP.NET 2.0의 데이터 바인딩된 컨트롤에 대해 PerformSelect 메서드는 DataBind 메서드에 해당하며 런타임에 데이터를 바인딩하기 위해 호출됩니다. PerformSelect 메서드는 GetDataPerformDataBinding 메서드를 호출합니다.

다음 코드 예제에서는 HierarchicalDataBoundControl 클래스에서 클래스를 파생시켜 데이터 바인딩된 사용자 지정 컨트롤을 만드는 방법을 보여 줍니다. GeneologyTree 컨트롤은 연결된 데이터 소스 컨트롤에서 검색한 데이터에 대한 텍스트 트리를 사용하여 pre HTML 섹션을 렌더링합니다.

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

다음 코드 예제에서는 앞의 예제에서 정의한 GeneologyTree 컨트롤을 사용하는 방법과 이 컨트롤을 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>

이 코드 예제에서 액세스하는 geneology.xml 파일에는 다음과 같은 데이터가 포함되어 있습니다.

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

  • AspNetHostingPermission  호스팅된 환경에서 작업하는 데 필요한 권한입니다. 요청 값: LinkDemand; 권한 값: Minimal
  • AspNetHostingPermission  호스팅된 환경에서 작업하는 데 필요한 권한입니다. 요청 값: InheritanceDemand; 권한 값: Minimal

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

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

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

Microsoft .NET Framework 3.0은 Windows Vista, Microsoft Windows XP SP2 및 Windows Server 2003 SP1에서 지원됩니다.

.NET Framework

3.0, 2.0에서 지원
표시: