HierarchicalDataBoundControl.PerformDataBinding メソッド
アセンブリ: System.Web (system.web.dll 内)


HierarchicalDataBoundControl クラスからデータ バインド コントロールを派生させる場合、DataBind メソッドでなくこのメソッドを実装します。コントロールのデータ バインディング ロジックを PerformDataBinding に配置すると、DataBinding イベントと DataBound イベントが不正な順序で発生することを防止できます。
HierarchicalDataBoundControl 基本クラスには、このメソッドの特定の実装は用意されていませんが、PerformSelect メソッドから PerformDataBinding メソッドを呼び出して、任意のユーザー インターフェイス コントロールの値を PerformSelect メソッドで取得したデータにバインドできます。

HierarchicalDataBoundControl の派生クラス内で PerformDataBinding メソッドを実装する方法を次のコード例に示します。GeneologyTree コントロールは、関連付けられている HierarchicalDataSourceView から取得した IHierarchicalEnumerable オブジェクトと IHierarchyData オブジェクトを繰り返し処理し、バインドされているデータのテキスト ツリー構造を作成します。このコード例は、HierarchicalDataBoundControl クラスのトピックで取り上げているコード例の一部分です。
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 ' PerformDataBinding 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 'RecurseDataBindInternal
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; } } }

Windows 98, Windows 2000 SP4, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


- HierarchicalDataBoundControl.PerformDataBinding メソッドのページへのリンク