HierarchicalDataBoundControl.GetData(String) 方法

定義

擷取 HierarchicalDataSourceView 物件,資料繫結控制項會用來執行資料作業。Retrieves a HierarchicalDataSourceView object that the data-bound control uses to perform data operations.

protected:
 virtual System::Web::UI::HierarchicalDataSourceView ^ GetData(System::String ^ viewPath);
protected virtual System.Web.UI.HierarchicalDataSourceView GetData (string viewPath);
abstract member GetData : string -> System.Web.UI.HierarchicalDataSourceView
override this.GetData : string -> System.Web.UI.HierarchicalDataSourceView
Protected Overridable Function GetData (viewPath As String) As HierarchicalDataSourceView

參數

viewPath
String

要擷取之檢視的階層式路徑。The hierarchical path of the view to retrieve.

傳回

HierarchicalDataSourceView

HierarchicalDataSourceView 物件,資料繫結控制項將其用於執行資料作業。The HierarchicalDataSourceView object that the data-bound control uses to perform data operations.

例外狀況

無法擷取指定之 viewPathHierarchicalDataSourceViewA HierarchicalDataSourceView could not be retrieved for the specified viewPath.

範例

下列程式碼範例示範如何 GetData 呼叫方法, HierarchicalDataSourceView 從相關聯的資料來源控制項取出物件,以及如何 HierarchicalDataSourceView.Select 呼叫方法來取得資料。The following code example demonstrates how the GetData method is called to retrieve the HierarchicalDataSourceView object from the associated data source control and how the HierarchicalDataSourceView.Select method is called to retrieve the data. 這個程式碼範例是針對類別提供之較大範例的一部分 HierarchicalDataBoundControlThis code example is part of a larger example provided for the HierarchicalDataBoundControl class.

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 Overrides Sub PerformDataBinding()
    MyBase.PerformDataBinding()

    ' Do not attempt to bind data if there is no
    ' data source set.
    If Not IsBoundUsingDataSourceID AndAlso DataSource Is Nothing Then
        Return
    End If

    Dim view As HierarchicalDataSourceView = GetData(RootNode.DataPath)

    If view Is Nothing Then
        Throw New InvalidOperationException _
        ("No view returned by data source control.")
    End If

    Dim enumerable As IHierarchicalEnumerable = view.Select()
    If Not (enumerable Is Nothing) Then

        Nodes.Clear()

        Try
            RecurseDataBindInternal(RootNode, enumerable, 1)
        Finally
        End Try
    End If

End Sub

Private Sub RecurseDataBindInternal(ByVal node As TreeNode, _
    ByVal enumerable As IHierarchicalEnumerable, _
    ByVal depth As Integer)

    Dim item As Object
    For Each item In enumerable

        Dim data As IHierarchyData = enumerable.GetHierarchyData(item)

        If Not data Is Nothing Then

            ' Create an object that represents the bound data
            ' to the control.
            Dim newNode As New TreeNode()
            Dim rvnode As 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 Then
                newNode.Text = DataBinder.GetPropertyValue _
                (data, DataTextField, Nothing)
            Else
                Dim props As PropertyDescriptorCollection = _
                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 Then
                    If Not props(0).GetValue(data) Is Nothing Then
                        newNode.Text = props(0).GetValue(data).ToString()
                    End If
                End If
            End If

            Nodes.Add(rvnode)

            If data.HasChildren Then
                Dim newEnumerable As IHierarchicalEnumerable = _
                    data.GetChildren()
                If Not (newEnumerable Is Nothing) Then
                    RecurseDataBindInternal(newNode, _
                    newEnumerable, depth + 1)
                End If
            End If

            If MaxDepth < depth Then
                MaxDepth = depth
            End If
        End If
    Next item

End Sub

備註

方法會藉 GetData HierarchicalDataSourceView 由呼叫方法,從相關聯的資料來源控制項抓取物件 GetDataSourceThe GetData method retrieves a HierarchicalDataSourceView object from the associated data source control by calling the GetDataSource method.

適用於

另請參閱