共用方式為


實作 Web Form 資料繫結控制項設計工具

資料繫結控制項設計工具的主要工作是當控制項位於設計工具中時,讓控制項存取不同的 (範例) 設計工具資料來源。.NET Framework 提供介面 (IDataSourceProvider) 來指定啟用存取資料來源的合約。資料繫結伺服器控制項的設計工具必須實作 IDataSourceProvider 介面和下列程序所描述的其他主要步驟。

若要實作資料繫結控制項設計工具

注意 下列步驟將說明 Web Form 樣板化資料繫結控制項設計工具範例的特定實作。這個實作可套用到控制項,且其型別物件的資料來源可接受 IEnumerable 參考。

  1. 定義直接或間接衍生自 ControlDesigner 的類別和實作 IDataSourceProvider 介面,如下列程式碼片段所示。

    Public Class DataboundControlDesigner
       Inherits ControlDesigner
       Implements IDataSourceProvider
       ...
    End Class
    [C#]
    public class DataboundControlDesigner : ControlDesigner, IDataSourceProvider {...}
    
  2. 公開指定設計階段資料來源的 (型別字串) 屬性 DataSource。如需實作這個屬性的範例說明,請參閱 Web Form 樣板化資料繫結控制項設計工具範例。設計工具的 DataSource 屬性在控制項 DataBindings 集合上方執行。

  3. 覆寫 GetDesignTimeHtml 方法並設定控制項的資料來源 (與您的設計工具相關) 為設計階段資料來源。如需如何覆寫這個方法來取代資料來源的範例,請參閱 Web Form 樣板化資料繫結控制項設計工具範例

  4. 覆寫 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;
            }
    
  5. 實作 IDataSourceProvider 介面的方法。這個介面有兩個方法 - GetResolvedSelectedDataSourceGetSelectedDataSource。下列程式碼範例說明在 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 的設計階段支援