實作 Web Form 資料繫結控制項設計工具
資料繫結控制項設計工具的主要工作是當控制項位於設計工具中時,讓控制項存取不同的 (範例) 設計工具資料來源。.NET Framework 提供介面 (IDataSourceProvider) 來指定啟用存取資料來源的合約。資料繫結伺服器控制項的設計工具必須實作 IDataSourceProvider 介面和下列程序所描述的其他主要步驟。
若要實作資料繫結控制項設計工具
注意 下列步驟將說明 Web Form 樣板化資料繫結控制項設計工具範例的特定實作。這個實作可套用到控制項,且其型別物件的資料來源可接受 IEnumerable 參考。
定義直接或間接衍生自 ControlDesigner 的類別和實作 IDataSourceProvider 介面,如下列程式碼片段所示。
Public Class DataboundControlDesigner Inherits ControlDesigner Implements IDataSourceProvider ... End Class [C#] public class DataboundControlDesigner : ControlDesigner, IDataSourceProvider {...}
公開指定設計階段資料來源的 (型別字串) 屬性 DataSource。如需實作這個屬性的範例說明,請參閱 Web Form 樣板化資料繫結控制項設計工具範例。設計工具的 DataSource 屬性在控制項 DataBindings 集合上方執行。
覆寫 GetDesignTimeHtml 方法並設定控制項的資料來源 (與您的設計工具相關) 為設計階段資料來源。如需如何覆寫這個方法來取代資料來源的範例,請參閱 Web Form 樣板化資料繫結控制項設計工具範例。
覆寫 PreFilterProperties 方法來取代 (或遮蓋) 控制項的 DataSource 屬性為設計階段 DataSource 屬性。PreFilterProperties 方法屬於 IDesignerFilter 介面,可使設計工具在設計階段取代或建立屬性和事件。IDesignerFilter 是由 ControlDesigner 實作。如需屬性篩選的詳細資訊,請參閱中繼資料篩選。下列程式碼片段說明如何覆寫 PreFilterProperties 方法。
Protected Overrides Sub PreFilterProperties(properties As IDictionary) MyBase.PreFilterProperties(properties) Dim prop As PropertyDescriptor prop = CType(properties("DataSource"), PropertyDescriptor) Debug.Assert(( Not (prop Is Nothing))) prop = TypeDescriptor.CreateProperty(Me.GetType(), prop, _ New Attribute() {New TypeConverterAttribute(GetType(DataSourceConverter))}) properties("DataSource") = prop End Sub [C#] protected override void PreFilterProperties(IDictionary properties) { base.PreFilterProperties(properties); PropertyDescriptor prop; prop = (PropertyDescriptor)properties["DataSource"]; Debug.Assert(prop != null); prop = TypeDescriptor.CreateProperty(this.GetType(), prop, new Attribute[] { new TypeConverterAttribute(typeof(DataSourceConverter)) }); properties["DataSource"] = prop; }
實作 IDataSourceProvider 介面的方法。這個介面有兩個方法 - GetResolvedSelectedDataSource 和 GetSelectedDataSource。下列程式碼範例說明在 Web Form 樣板化資料繫結控制項設計工具範例裡這些方法的實作 (Implementation)。
Function GetResolvedSelectedDataSource() As IEnumerable Implements IDataSourceProvider.GetResolvedSelectedDataSource Return CType(CType(Me, IDataSourceProvider).GetSelectedDataSource(), IEnumerable) End Function Function GetSelectedDataSource() As Object Implements IDataSourceProvider.GetSelectedDataSource Dim selectedDataSource As Object = Nothing Dim dataSource As String = Nothing Dim binding As DataBinding = DataBindings("DataSource") If Not (binding Is Nothing) Then dataSource = binding.Expression End If If Not (dataSource Is Nothing) Then Dim componentSite As ISite = Component.Site If Not (componentSite Is Nothing) Then Dim container As IContainer = CType(componentSite.GetService(GetType(IContainer)), IContainer) If Not (container Is Nothing) Then Dim comp As IComponent = container.Components(dataSource) If TypeOf comp Is IEnumerable Then selectedDataSource = comp End If End If End If End If Return selectedDataSource End Function [C#] IEnumerable IDataSourceProvider.GetResolvedSelectedDataSource() { return (IEnumerable)((IDataSourceProvider)this).GetSelectedDataSource(); } object IDataSourceProvider.GetSelectedDataSource() { object selectedDataSource = null; string dataSource = null; DataBinding binding = DataBindings["DataSource"]; if (binding != null) { dataSource = binding.Expression; } if (dataSource != null) { ISite componentSite = Component.Site; if (componentSite != null) { IContainer container = (IContainer)componentSite.GetService(typeof(IContainer)); if (container != null) { IComponent comp = container.Components[dataSource]; if (comp is IEnumerable) { selectedDataSource = comp; } } } } return selectedDataSource; }
如需含有上述步驟的完整範例,請參閱 Web Form 樣板化資料繫結控制項設計工具範例。
請參閱
Web Form 樣板化資料繫結控制項設計工具範例 | 實作 Web Form 樣板編輯器 | 自訂設計工具 | Web Form 的設計階段支援