次の方法で共有


TemplatedControlDesigner クラス

テンプレート ベースのサーバー コントロールのデザイン時の動作を拡張します。

この型のすべてのメンバの一覧については、TemplatedControlDesigner メンバ を参照してください。

System.Object
   System.ComponentModel.Design.ComponentDesigner
      System.Web.UI.Design.HtmlControlDesigner
         System.Web.UI.Design.ControlDesigner
            System.Web.UI.Design.TemplatedControlDesigner
               System.Web.UI.Design.WebControls.BaseDataListDesigner

MustInherit Public Class TemplatedControlDesigner
   Inherits ControlDesigner
[C#]
public abstract class TemplatedControlDesigner : ControlDesigner
[C++]
public __gc __abstract class TemplatedControlDesigner : public
   ControlDesigner
[JScript]
public abstract class TemplatedControlDesigner extends
   ControlDesigner

スレッドセーフ

この型の public static (Visual Basicでは Shared) のすべてのメンバは、マルチスレッド操作で安全に使用できます。インスタンスのメンバの場合は、スレッドセーフであるとは限りません。

解説

Notes to Inheritors[note] TemplatedControlDesigner から継承する場合、 CreateTemplateEditingFrameGetCachedTemplateEditingVerbsGetTemplateContentSetTemplateContent の各メンバをオーバーライドする必要があります。

使用例

[Visual Basic] TemplatedControlDesigner クラスから派生したカスタム デザイナ クラスを作成するコード例を次に示します。このクラスは、 System.Collections.ControlDesigner.AllowResize プロパティと System.Collections.ControlDesigner.DesignTimeHtmlRequiresLoadComplete プロパティ、および GetCachedTemplateEditingVerbs メソッドをオーバーライドします。

 
' Create a custom designer, named TemplatedListDesigner, that
' derives from the TemplatedControlDesigner class and implements
' the IDataSourceProvider interface.
Imports System
Imports System.Collections
Imports System.ComponentModel
Imports System.ComponentModel.Design
Imports System.Data
Imports System.Diagnostics
Imports System.Web.UI
Imports System.Web.UI.Design
Imports System.Web.UI.WebControls
Imports Examples.AspNet

Namespace Examples.AspNet.Design

   Public Class TemplatedListDesigner
      Inherits TemplatedControlDesigner
      Implements IDataSourceProvider
      
      ' Declare variables.
      Private dummyDataTable As DataTable
      Private designTimeDataTable As DataTable
      Private templateVerbs() As TemplateEditingVerb
      Private templateVerbsDirty As Boolean
      
      ' When an instance of this class is created,
      ' a Boolean property, named templateVerbsDirty, 
      ' is set to True.
      Public Sub New()
         templateVerbsDirty = True
      End Sub
      Public Overrides ReadOnly Property AllowResize() As Boolean
         Get
            ' When templates are not defined, render a read-only,
            ' fixed-size block. Once templates are defined or
            ' are being edited, the control allows resizing.
            Return TemplatesExist Or InTemplateMode
         End Get
      End Property

      ' Create a design-time DataSource property that 
      ' tracks to a key with the same name in the control's
      ' DataBindingCollection.      
      Public Property DataSource() As String
         Get
            Dim binding As DataBinding = DataBindings("DataSource")
            
            If Not (binding Is Nothing) Then
               Return binding.Expression
            End If
            Return [String].Empty
         End Get
         Set
            If value Is Nothing Or value.Length = 0 Then
               DataBindings.Remove("DataSource")
            Else
               Dim binding As DataBinding = DataBindings("DataSource")
               
               If binding Is Nothing Then
                  binding = New DataBinding("DataSource", GetType(IEnumerable), value)
               Else
                  binding.Expression = value
               End If
               DataBindings.Add(binding)
            End If
            
            OnDataSourceChanged()
            OnBindingsCollectionChanged("DataSource")
         End Set
      End Property

      ' Override the DesignTimeHtmlRequiresLoadComplete property.      
      Public Overrides ReadOnly Property DesignTimeHtmlRequiresLoadComplete() As Boolean
         Get
            ' If there is a data source, look it up in the container
            ' and require the document to be loaded completely.
            Return DataSource.Length <> 0
         End Get
      End Property

      ' Create a read-only property that determines whether the control
      ' is using templates at design time.      
      Protected ReadOnly Property TemplatesExist() As Boolean
         Get
            Return Not (CType(Component, TemplatedList).ItemTemplate Is Nothing)
         End Get
      End Property
    
      ' Override the CreateTemplateEditingFrame method to 
      ' provide a frame in which to manipulate
      ' templates at design time. 
      Protected Overrides Function CreateTemplateEditingFrame( _
        verb As TemplateEditingVerb) As ITemplateEditingFrame
         Dim teService As ITemplateEditingService = _
          CType(GetService(GetType(ITemplateEditingService)), ITemplateEditingService)
         Debug.Assert( Not (teService Is Nothing), _
          "How did we get this far without an ITemplateEditingService?")
         Debug.Assert((verb.Index = 0))
         
         Dim templateNames() As String = {"ItemTemplate"}
         Dim templateStyles() As Style = {CType(Component, TemplatedList).ItemStyle}
         
         Dim editingFrame As ITemplateEditingFrame = _
          teService.CreateFrame( _
           Me, verb.Text, templateNames, CType(Component, TemplatedList).ControlStyle, templateStyles)
         Return editingFrame
      End Function

      ' Override the Dispose method to release resources associated
      ' with this designer.
      Protected  Overloads Overrides Sub Dispose(disposing As Boolean)
        If disposing
         DisposeTemplateVerbs()
        End If
         MyBase.Dispose(disposing)
      End Sub
      
      ' Create a method that releases resources used by the
      ' designer verbs associated with design-time templates.
      Private Sub DisposeTemplateVerbs()
         If Not (templateVerbs Is Nothing) Then
            templateVerbs(0).Dispose()
            
            templateVerbs = Nothing
            templateVerbsDirty = True
         End If
      End Sub
   
      ' Override the GetCachedTemplateEditingVerbs method to check
      ' whether the verbs have been changed. If they have, a new
      ' collection of verbs is created for use with this designer.     
      Protected Overrides Function GetCachedTemplateEditingVerbs() As TemplateEditingVerb()
         If templateVerbsDirty = True Then
            DisposeTemplateVerbs()
            
            templateVerbs = New TemplateEditingVerb(1) {}
            templateVerbs(0) = New TemplateEditingVerb("Item Template", 0, Me)
            
            templateVerbsDirty = False
         End If
         
         Return templateVerbs
      End Function
      
      Protected Function GetDesignTimeDataSource(minimumRows As Integer, ByRef dummyDataSource As Boolean) As IEnumerable
         dummyDataSource = False
         
         Dim selectedDataSource As IEnumerable = CType(Me, IDataSourceProvider).GetResolvedSelectedDataSource()
         Dim dataTable As DataTable = designTimeDataTable
         
         ' Use the data table corresponding to the selected data source 
         ' if possible.
         If dataTable Is Nothing Then
            If Not (selectedDataSource Is Nothing) Then
               designTimeDataTable = DesignTimeData.CreateSampleDataTable(selectedDataSource)
               dataTable = designTimeDataTable
            End If
            
            If dataTable Is Nothing Then
               ' Fall back on a dummy data source if a sample data-table cannot be created.
               If dummyDataTable Is Nothing Then
                  dummyDataTable = DesignTimeData.CreateDummyDataTable()
               End If
               
               dataTable = dummyDataTable
               dummyDataSource = True
            End If
         End If
         
         Dim liveDataSource As IEnumerable = DesignTimeData.GetDesignTimeDataSource(dataTable, minimumRows)
         Return liveDataSource
      End Function
      
      ' Override the GetDesignTimeHtml method to display templates
      ' in the designer if they exist.
      Public Overrides Function GetDesignTimeHtml() As String
         Dim control As TemplatedList = CType(Component, TemplatedList)
         Dim designTimeHtml As String = Nothing
         Dim hasATemplate As Boolean = Me.TemplatesExist
         
         If hasATemplate Then
            Dim dummyDataSource As Boolean
            Dim designTimeDataSource As IEnumerable = GetDesignTimeDataSource(5, dummyDataSource)
            
            Try
               control.DataSource = designTimeDataSource
               control.DataBind()
               
               designTimeHtml = MyBase.GetDesignTimeHtml()
            Finally
               control.DataSource = Nothing
            End Try
         Else
            designTimeHtml = GetEmptyDesignTimeHtml()
         End If
         
         Return designTimeHtml
      End Function
      
      ' Override the GetEmptyDesignTimeHtml to check whether 
      ' template mode can be used from the designer, and provide
      ' display messages for both cases.      
      Protected Overrides Function GetEmptyDesignTimeHtml() As String
         Dim textValue As String
         
         If CanEnterTemplateMode Then
            textValue = "Right click and choose a set of templates to edit their content.<br>The ItemTemplate is required."
         Else
            textValue = "Switch to HTML view to edit the control's templates.<br>The ItemTemplate is required."
         End If
         Return CreatePlaceHolderDesignTimeHtml(textValue)
      End Function

      ' Override the GetErrorDesignTimeHtml to display an
      ' error message if an error occurs in design-time rendering of
      ' the control.      
      Protected Overrides Function GetErrorDesignTimeHtml(e As Exception) As String
         Debug.Fail(e.ToString())
         Return CreatePlaceHolderDesignTimeHtml("There was an error rendering the control.<br>Make sure all properties are valid.")
      End Function
 
      ' Override the GetTemplateContainerDataSource to return the 
      ' data source to be used by the templated control.    
      Public Overrides Function GetTemplateContainerDataSource(templateName As String) As IEnumerable
         Return CType(Me, IDataSourceProvider).GetResolvedSelectedDataSource()
      End Function
      
      Public Overrides Function GetTemplateContainerDataItemProperty(templateName As String) As String
         Return "DataItem"
      End Function
  
      ' Override the GetTemplateContent method to return the content
      ' contained in the template.
      Public Overrides Function GetTemplateContent(editingFrame As ITemplateEditingFrame, templateName As String, ByRef allowEditing As Boolean) As String
         ' Ensure that the designer verb is first in the collection
         ' and that the name of the template is ItemTemplate.
         Debug.Assert((editingFrame.Verb.Index = 0))
         Debug.Assert(templateName.Equals("ItemTemplate"))
         allowEditing = True
         
         Dim template As ITemplate = CType(Component, TemplatedList).ItemTemplate
         Dim templateContent As String = [String].Empty
         
         ' If the template is already created, use the text
         ' already created for it.
         If Not (template Is Nothing) Then
            templateContent = GetTextFromTemplate(template)
         End If
         
         Return templateContent
      End Function
      ' Override the OnComponentChanged method to change
      ' the control's DataSource or styles in the designer.
      Public Overrides Sub OnComponentChanged(sender As Object, e As ComponentChangedEventArgs)
         If Not (e.Member Is Nothing) Then
            Dim memberName As String = e.Member.Name
            If memberName.Equals("DataSource") Or memberName.Equals("DataMember") Then
               OnDataSourceChanged()
            Else
               If memberName.Equals("ItemStyle") Then
                  OnStylesChanged()
               End If
            End If
         End If 
         MyBase.OnComponentChanged(sender, e)
      End Sub
      
      ' Create a method that sets the data table 
      ' associated with the templates to nothing.
      Protected Overridable Sub OnDataSourceChanged()
         designTimeDataTable = Nothing
      End Sub
      
      ' Create a method that determines whether the designer
      ' verbs associated with the control's templates have
      ' changed.
      Protected Sub OnStylesChanged()
         OnTemplateEditingVerbsChanged()
      End Sub
      
      ' Create a method that notifies all callers
      ' that the designer verbs collection has changed.
      Protected Sub OnTemplateEditingVerbsChanged()
         templateVerbsDirty = True
      End Sub
      
      ' Override the PreFilterProperties method to allow the DataSource
      ' associated with the control to be described in the designer.
      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
      ' Override the SetTemplateContent method to check whether the template
      ' exists. If it does, set its content to the value already created for it.
      ' 
      Public Overrides Sub SetTemplateContent( _
        editingFrame As ITemplateEditingFrame, _
        templateName As String, _
        templateContent As String)
         Debug.Assert((editingFrame.Verb.Index = 0))
         Debug.Assert(templateName.Equals("ItemTemplate"))
         
         Dim template As ITemplate = Nothing
         
         If Not (templateContent Is Nothing) And templateContent.Length <> 0 Then
            template = GetTemplateFromText(templateContent)
         End If
         
         CType(Component, TemplatedList).ItemTemplate = template
      End Sub

      ' Create a method that implements the 
      ' IDataSourceProvider.GetResolvedSelectedDataSource method.
      ' It converts the object returned from the GetSelectedDataSource
      ' method into an IEnumberable object to allow iteration over
      ' the returned object.
      Function GetResolvedSelectedDataSource() As IEnumerable _
       Implements IDataSourceProvider.GetResolvedSelectedDataSource
         Return CType(CType(Me, IDataSourceProvider).GetSelectedDataSource(), IEnumerable)
      End Function
 
      ' Create a method that implements the 
      ' IDataSourceProvider.GetSelectedDataSource method. 
      ' Return the data source as an IEnumerable object,
      ' if possible.     
      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
   End Class
End Namespace

[C#, C++, JScript] C#、C++、および JScript のサンプルはありません。Visual Basic のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン 言語のフィルタ をクリックします。

必要条件

名前空間: System.Web.UI.Design

プラットフォーム: Windows 2000, Windows XP Professional, Windows Server 2003 ファミリ

アセンブリ: System.Design (System.Design.dll 内)

参照

TemplatedControlDesigner メンバ | System.Web.UI.Design 名前空間 | IDesigner | ControlDesigner