Export (0) Print
Expand All

ControlParser Class

Provides methods for creating a Web Server Control or ITemplate from a string of aspx code representing a persisted control or template.

For a list of all members of this type, see ControlParser Members.

System.Object
   System.Web.UI.Design.ControlParser

[Visual Basic]
NotInheritable Public Class ControlParser
[C#]
public sealed class ControlParser
[C++]
public __gc __sealed class ControlParser
[JScript]
public class ControlParser

Thread Safety

Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.

Remarks

ControlParser provides methods that can create a Control or ITemplate by parsing a string of control or template persistence data.

Example

[Visual Basic] 
Imports System
Imports System.Drawing
Imports System.Drawing.Design
Imports System.IO
Imports System.Web.UI
Imports System.Web.UI.Design
Imports System.Web.UI.WebControls
Imports System.ComponentModel
Imports System.ComponentModel.Design
Imports System.Windows.Forms
Imports System.Windows.Forms.Design

' Web control designer provides an interface 
' to use the ControlPersister and ControlParser.
Public Class ControlParserPersisterDesigner
    Inherits System.Web.UI.Design.ControlDesigner

    Public Sub New()
    End Sub

    ' Provides designer verb menu commands to 
    ' persist a control and to load a persisted control.
    Public Overrides ReadOnly Property Verbs() _
    As System.ComponentModel.Design.DesignerVerbCollection
        Get
            Dim dvc As New DesignerVerbCollection()
            dvc.Add(New DesignerVerb("Load Persisted Control...", _
                New EventHandler(AddressOf Me.loadPersistedControl)))
            dvc.Add(New DesignerVerb("Parse and Save Control...", _
                New EventHandler(AddressOf Me.saveControl)))
            Return dvc
        End Get
    End Property

    ' Displays a textbox form to receive an HTML 
    ' string that represents a control, and creates
    ' a toolbox item for the control, if not already
    ' present in the selected toolbox category.
    Private Sub loadPersistedControl(ByVal sender As Object, ByVal e As EventArgs)
        ' Display a StringInputForm to obtain a persisted control string.
        Dim inputForm As New StringInputForm()

        If inputForm.ShowDialog() <> DialogResult.OK Then
            Return
        End If
        If inputForm.tbox.Text.Length < 2 Then
            Return
        End If
        ' Obtain an IDesignerHost for the design-mode document.
        Dim host As IDesignerHost = CType(Me.Component.Site.GetService(GetType(IDesignerHost)), IDesignerHost)

        ' Create a Web control from the persisted control string.
        Dim ctrl As System.Web.UI.Control = ControlParser.ParseControl(host, inputForm.tbox.Text.Trim())

        ' Create a Web control toolbox item for the type of the control.
        Dim item As New System.Web.UI.Design.WebControlToolboxItem(ctrl.GetType())

        ' Add the Web control toolbox item to the toolbox.
        Dim toolService As IToolboxService = CType(Me.Component.Site.GetService(GetType(IToolboxService)), IToolboxService)
        If Not (toolService Is Nothing) Then
            toolService.AddToolboxItem(item)
        Else
            Throw New Exception("IToolboxService was not found.")
        End If
    End Sub

    ' Displays a list of controls in the project, if any,
    ' and displays the HTML representing the persisted, selected control.       
    Private Sub saveControl(ByVal sender As Object, ByVal e As EventArgs)
        ' Get the collection of components in the current 
        ' design mode document.
        Dim documentComponents As ComponentCollection = _
            Me.Component.Site.Container.Components

        ' Filter the components to those that derive from the 
        ' System.Web.UI.Control class.

        ' Create an IComponent array of the maximum possible length needed.
        Dim filterArray(documentComponents.Count) As IComponent

        ' Count the total qualifying components.
        Dim total As Integer = 0
        Dim i As Integer
        For i = 0 To documentComponents.Count - 1
            ' If the component derives from System.Web.UI.Control, 
            ' copy a reference to the control to the filterArray 
            ' array and increment the control count.
            If GetType(System.Web.UI.Control).IsAssignableFrom(CType(documentComponents(i), Object).GetType()) Then
                If Not (CType(documentComponents(i), System.Web.UI.Control).UniqueID Is Nothing) Then
                    filterArray(total) = documentComponents(i)
                    total += 1
                End If
            End If
        Next i

        If total = 0 Then
            Throw New Exception( _
                "Document contains no System.Web.UI.Control components.")
        End If

        ' Move the components that derive from System.Web.UI.Control to a 
        ' new array of the correct size.
        Dim controlArray(total - 1) As System.Web.UI.Control

        For i = 0 To total - 1
            controlArray(i) = CType(filterArray(i), System.Web.UI.Control)
        Next i

        ' Create a ControlSelectionForm to provide a persistence 
        ' configuration interface.
        Dim selectionForm As New ControlSelectionForm(controlArray)

        ' Display the form.
        If selectionForm.ShowDialog() <> DialogResult.OK Then
            Return
        End If

        ' Validate the selection.
        If selectionForm.controlList.SelectedIndex = -1 Then
            Throw New Exception("You must select a control to persist.")
        End If

        ' Parse the selected control.
        Dim persistedData As String = ControlPersister.PersistControl( _
            controlArray(selectionForm.controlList.SelectedIndex))

        ' Display the control persistence string in a text box.
        Dim displayForm As New StringDisplayForm(persistedData)
        displayForm.ShowDialog()
    End Sub

End Class

' Simple text display control hosts the ControlParserPersisterDesigner.
<DesignerAttribute(GetType(ControlParserPersisterDesigner), _
    GetType(IDesigner))> _
Public Class ControlParserPersisterDesignerControl
    Inherits System.Web.UI.WebControls.WebControl

    Private [text_] As String

    <Bindable(True), Category("Appearance"), DefaultValue("")> _
    Public Property [Text]() As String
        Get
            Return [text_]
        End Get
        Set(ByVal Value As String)
            [text_] = Value
        End Set
    End Property

    Public Sub New()
        [Text] = "Right-click here to access control persistence " & _
                    "methods in design mode"
    End Sub

    Protected Overrides Sub Render(ByVal output As HtmlTextWriter)
        output.Write([Text])
    End Sub
End Class

' Provides a form with a list for selection.
Friend Class ControlSelectionForm
    Inherits System.Windows.Forms.Form
    Private controlArray() As System.Web.UI.Control
    Public controlList As System.Windows.Forms.ListBox

    Public Sub New(ByVal controlArray() As System.Web.UI.Control)
        Me.controlArray = controlArray

        Me.Size = New Size(400, 500)
        Me.Text = "Control Persister Selection Form"

        Me.SuspendLayout()

        Dim label1 As New System.Windows.Forms.Label()
        label1.Text = "Select the control to persist:"
        label1.Size = New Size(240, 20)
        label1.Location = New Point(10, 10)
        Me.Controls.Add(label1)

        controlList = New System.Windows.Forms.ListBox()
        controlList.Size = New Size(370, 400)
        controlList.Location = New Point(10, 30)
        controlList.Anchor = AnchorStyles.Left Or AnchorStyles.Top _
                Or AnchorStyles.Bottom Or AnchorStyles.Right
        Me.Controls.Add(controlList)

        Dim okButton As New System.Windows.Forms.Button()
        okButton.Text = "OK"
        okButton.Size = New Size(80, 24)
        okButton.Location = New Point(Me.Width - 100, Me.Height - 60)
        okButton.Anchor = AnchorStyles.Bottom Or AnchorStyles.Right
        okButton.DialogResult = DialogResult.OK
        Me.Controls.Add(okButton)

        Dim cancelButton As New System.Windows.Forms.Button()
        cancelButton.Text = "Cancel"
        cancelButton.Size = New Size(80, 24)
        cancelButton.Location = New Point(Me.Width - 200, Me.Height - 60)
        cancelButton.Anchor = AnchorStyles.Bottom Or AnchorStyles.Right
        cancelButton.DialogResult = DialogResult.Cancel
        Me.Controls.Add(cancelButton)

        Dim i As Integer
        For i = 0 To controlArray.Length - 1
            controlList.Items.Add(controlArray(i).UniqueID)
        Next i
        Me.ResumeLayout()
    End Sub
End Class

' Provides a form with a multiline text box display.
Friend Class StringDisplayForm
    Inherits System.Windows.Forms.Form

    Public Sub New(ByVal displayText As String)
        Me.Size = New Size(400, 400)
        Me.Text = "Control Persistence String"

        Me.SuspendLayout()
        Dim tbox As New System.Windows.Forms.TextBox()
        tbox.Multiline = True
        tbox.Size = New Size(Me.Width - 40, Me.Height - 90)
        tbox.Text = displayText
        Me.Controls.Add(tbox)

        Dim okButton As New System.Windows.Forms.Button()
        okButton.Text = "OK"
        okButton.Size = New Size(80, 24)
        okButton.Location = New Point(Me.Width - 100, Me.Height - 60)
        okButton.Anchor = AnchorStyles.Bottom Or AnchorStyles.Right
        okButton.DialogResult = DialogResult.OK
        Me.Controls.Add(okButton)

        Me.ResumeLayout()
    End Sub
End Class

' Provides a form with a multiline text box for input.
Friend Class StringInputForm
    Inherits System.Windows.Forms.Form
    Public tbox As System.Windows.Forms.TextBox

    Public Sub New()
        Me.Size = New Size(400, 400)
        Me.Text = "Input Control Persistence String"

        Me.SuspendLayout()
        tbox = New System.Windows.Forms.TextBox()
        tbox.Multiline = True
        tbox.Size = New Size(Me.Width - 40, Me.Height - 90)
        tbox.Text = ""
        Me.Controls.Add(tbox)

        Dim okButton As New System.Windows.Forms.Button()
        okButton.Text = "OK"
        okButton.Size = New Size(80, 24)
        okButton.Location = New Point(Me.Width - 100, Me.Height - 60)
        okButton.Anchor = AnchorStyles.Bottom Or AnchorStyles.Right
        okButton.DialogResult = DialogResult.OK
        Me.Controls.Add(okButton)

        Dim cancelButton As New System.Windows.Forms.Button()
        cancelButton.Text = "Cancel"
        cancelButton.Size = New Size(80, 24)
        cancelButton.Location = New Point(Me.Width - 200, Me.Height - 60)
        cancelButton.Anchor = AnchorStyles.Bottom Or AnchorStyles.Right
        cancelButton.DialogResult = DialogResult.Cancel
        Me.Controls.Add(cancelButton)

        Me.ResumeLayout()
    End Sub
End Class

[C#] 
using System;
using System.Drawing;
using System.Drawing.Design;
using System.IO;
using System.Web.UI;
using System.Web.UI.Design;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Windows.Forms;
using System.Windows.Forms.Design;

namespace ControlParserPersisterDesignerControl
{
    // Web control designer provides an interface 
    // to use the ControlPersister and ControlParser.
    public class ControlParserPersisterDesigner : 
        System.Web.UI.Design.ControlDesigner
    {
        public ControlParserPersisterDesigner() : base()
        {
        }

        // Provides designer verb menu commands to 
        // persist a control and to load a persisted control.
        public override 
            System.ComponentModel.Design.DesignerVerbCollection Verbs
        {
            get
            {
                DesignerVerbCollection dvc = new DesignerVerbCollection();                               
                dvc.Add( new DesignerVerb("Load Persisted Control...", 
                    new EventHandler(this.loadPersistedControl)) ); 
                dvc.Add( new DesignerVerb("Parse and Save Control...", 
                    new EventHandler(this.saveControl)) ); 
                return dvc;
            }
        }

        // Displays a textbox form to receive an HTML 
        // string that represents a control, and creates
        // a toolbox item for the control, if not already
        // present in the selected toolbox category.
        private void loadPersistedControl(object sender, EventArgs e)
        {
            // Display a StringInputForm to obtain a persisted control string.
            StringInputForm inputForm = new StringInputForm();

            if( inputForm.ShowDialog() != DialogResult.OK )
                return;
            if( inputForm.tbox.Text.Length < 2 )
                return;

            // Obtain an IDesignerHost for the design-mode document.
            IDesignerHost host = (IDesignerHost)
                this.Component.Site.GetService(typeof(IDesignerHost));

            // Create a Web control from the persisted control string.
            System.Web.UI.Control ctrl = 
                ControlParser.ParseControl(host, inputForm.tbox.Text.Trim());

            // Create a Web control toolbox item for the type of the control
            System.Web.UI.Design.WebControlToolboxItem item = 
                new System.Web.UI.Design.WebControlToolboxItem(ctrl.GetType());
            
            // Add the Web control toolbox item to the toolbox
            IToolboxService toolService = (IToolboxService)
                this.Component.Site.GetService(typeof(IToolboxService));
            if( toolService != null )
                toolService.AddToolboxItem(item);
            else
                throw new Exception("IToolboxService was not found.");                               
        }

        // Displays a list of controls in the project, if any,
        // and displays the HTML representing the persisted, selected control.       
        private void saveControl(object sender, EventArgs e)
        {
            // Get the collection of components in the current 
            // design mode document.
            ComponentCollection documentComponents = 
                this.Component.Site.Container.Components;
                        
            // Filter the components to those that derive from the 
            // System.Web.UI.Control class.

            // Create an IComponent array of the maximum possible length needed.
            IComponent[] filterArray = new IComponent[documentComponents.Count];
            
            // Count the total qualifying components.
            int total = 0;
            for(int i=0; i<documentComponents.Count; i++)
            {
                // If the component derives from System.Web.UI.Control, 
                // copy a reference to the control to the filterArray 
                // array and increment the control count.
                if( typeof(System.Web.UI.Control).IsAssignableFrom( 
                    documentComponents[i].GetType() ) )
                {
                    if( ((System.Web.UI.Control)documentComponents[i]).UniqueID 
                        != null )
                    {
                        filterArray[total] = documentComponents[i];
                        total++;
                    }
                }
            }

            if( total == 0 )
                throw new Exception(
                    "Document contains no System.Web.UI.Control components.");

            // Move the components that derive from System.Web.UI.Control to a 
            // new array of the correct size.
            System.Web.UI.Control[] controlArray = 
                new System.Web.UI.Control[total];
            for(int i=0; i<total; i++)
                controlArray[i] = (System.Web.UI.Control)filterArray[i];              

            // Create a ControlSelectionForm to provide a persistence 
            // configuration interface.
            ControlSelectionForm selectionForm = 
                new ControlSelectionForm(controlArray);

            // Display the form.
            if( selectionForm.ShowDialog() != DialogResult.OK )
                return;
            
            // Validate the selection.
            if( selectionForm.controlList.SelectedIndex == -1 )
                throw new Exception("You must select a control to persist.");

            // Parse the selected control.
            string persistedData = ControlPersister.PersistControl(
                controlArray[selectionForm.controlList.SelectedIndex]);

            // Display the control persistence string in a text box.
            StringDisplayForm displayForm = 
                new StringDisplayForm(persistedData);
            displayForm.ShowDialog();
        }
    }

    // Simple text display control hosts the ControlParserPersisterDesigner.
    [DesignerAttribute(typeof(ControlParserPersisterDesigner), 
         typeof(IDesigner))]
    public class ControlParserPersisterDesignerControl : 
        System.Web.UI.WebControls.WebControl
    {        
        private string text;

        [Bindable(true),
        Category("Appearance"),
        DefaultValue("")]
        public string Text
        {
            get
            {
                return text;
            }
            set
            {
                text = value;
            }
        }

        public ControlParserPersisterDesignerControl() : base()
        {
            text = "Right-click here to access control persistence " +
                "methods in design mode";            
        }

        protected override void Render(HtmlTextWriter output)
        {
            output.Write(Text);
        }        
    }

    // Provides a form with a list for selection.
    internal class ControlSelectionForm : System.Windows.Forms.Form
    {
        private System.Web.UI.Control[] controlArray;
        public System.Windows.Forms.ListBox controlList;

        public ControlSelectionForm(System.Web.UI.Control[] controlArray)
        {
            this.controlArray = controlArray;
            
            this.Size = new Size( 400, 500 );            
            this.Text = "Control Persister Selection Form";

            this.SuspendLayout();

            System.Windows.Forms.Label label1 = 
                new System.Windows.Forms.Label();
            label1.Text = "Select the control to persist:";
            label1.Size = new Size( 240, 20 );
            label1.Location = new Point(10, 10 );
            this.Controls.Add( label1 );

            controlList = new System.Windows.Forms.ListBox();        
            controlList.Size = new Size( 370, 400 );
            controlList.Location = new Point( 10, 30 );
            controlList.Anchor = AnchorStyles.Left | AnchorStyles.Top | 
                AnchorStyles.Bottom | AnchorStyles.Right;
            this.Controls.Add( controlList );

            System.Windows.Forms.Button okButton = 
                new System.Windows.Forms.Button();
            okButton.Text = "OK";
            okButton.Size = new Size(80, 24);
            okButton.Location = 
                new Point( this.Width - 100, this.Height - 60 );
            okButton.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
            okButton.DialogResult = DialogResult.OK;
            this.Controls.Add( okButton );

            System.Windows.Forms.Button cancelButton = 
                new System.Windows.Forms.Button();
            cancelButton.Text = "Cancel";
            cancelButton.Size = new Size(80, 24);
            cancelButton.Location = 
                new Point( this.Width - 200, this.Height - 60 );
            cancelButton.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
            cancelButton.DialogResult = DialogResult.Cancel;
            this.Controls.Add( cancelButton );

            for( int i=0; i< controlArray.Length; i++ )
                controlList.Items.Add( controlArray[i].UniqueID );

            this.ResumeLayout();
        }
    }

    // Provides a form with a multiline text box display.
    internal class StringDisplayForm : System.Windows.Forms.Form
    {
        public StringDisplayForm(string displayText)
        {
            this.Size = new Size(400, 400);
            this.Text = "Control Persistence String";
            
            this.SuspendLayout();
            System.Windows.Forms.TextBox tbox = 
                new System.Windows.Forms.TextBox();
            tbox.Multiline = true;
            tbox.Size = new Size(this.Width-40, this.Height-90);            
            tbox.Text = displayText;
            this.Controls.Add(tbox);

            System.Windows.Forms.Button okButton = 
                new System.Windows.Forms.Button();
            okButton.Text = "OK";
            okButton.Size = new Size(80, 24);
            okButton.Location = 
                new Point( this.Width - 100, this.Height - 60 );
            okButton.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
            okButton.DialogResult = DialogResult.OK;
            this.Controls.Add( okButton );

            this.ResumeLayout();
        }
    }

    // Provides a form with a multiline text box for input.
    internal class StringInputForm : System.Windows.Forms.Form
    {
        public System.Windows.Forms.TextBox tbox;

        public StringInputForm()
        {
            this.Size = new Size(400, 400);
            this.Text = "Input Control Persistence String";
            
            this.SuspendLayout();
            tbox = new System.Windows.Forms.TextBox();
            tbox.Multiline = true;
            tbox.Size = new Size(this.Width-40, this.Height-90);            
            tbox.Text = "";
            this.Controls.Add(tbox);

            System.Windows.Forms.Button okButton = 
                new System.Windows.Forms.Button();
            okButton.Text = "OK";
            okButton.Size = new Size(80, 24);
            okButton.Location = 
                new Point( this.Width - 100, this.Height - 60 );
            okButton.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
            okButton.DialogResult = DialogResult.OK;
            this.Controls.Add( okButton );

            System.Windows.Forms.Button cancelButton = 
                new System.Windows.Forms.Button();
            cancelButton.Text = "Cancel";
            cancelButton.Size = new Size(80, 24);
            cancelButton.Location = 
                new Point( this.Width - 200, this.Height - 60 );
            cancelButton.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
            cancelButton.DialogResult = DialogResult.Cancel;
            this.Controls.Add( cancelButton );

            this.ResumeLayout();
        }
    }
}

[C++] 
#using <mscorlib.dll>
#using <System.dll>
#using <System.Drawing.dll>
#using <System.Web.dll>
#using <System.Design.dll>
#using <System.Windows.Forms.dll>
using namespace System;
using namespace System::Drawing;
using namespace System::Drawing::Design;
using namespace System::IO;
using namespace System::Web::UI;
using namespace System::Web::UI::Design;
using namespace System::Web::UI::WebControls;
using namespace System::ComponentModel;
using namespace System::ComponentModel::Design;
using namespace System::Windows::Forms;
using namespace System::Windows::Forms::Design;

// Provides a form with a multiline text box display.
private __gc class StringDisplayForm : 
   public System::Windows::Forms::Form {
public:
   StringDisplayForm(String* displayText) {
      this->Size = System::Drawing::Size(400, 400);
      this->Text = S"Control Persistence String";

      this->SuspendLayout();
      System::Windows::Forms::TextBox* tbox = 
         new System::Windows::Forms::TextBox();
      tbox->Multiline = true;
      tbox->Size = System::Drawing::Size(this->Width-40, this->Height-90);
      tbox->Text = displayText;
      this->Controls->Add(tbox);

      System::Windows::Forms::Button* okButton = 
         new System::Windows::Forms::Button();
      okButton->Text = S"OK";
      okButton->Size = System::Drawing::Size(80, 24);
      okButton->Location =  Point(this->Width - 100, this->Height - 60);
      okButton->Anchor = AnchorStyles(AnchorStyles::Bottom | AnchorStyles::Right);
      okButton->DialogResult = DialogResult::OK;
      this->Controls->Add(okButton);
      this->ResumeLayout();
   }
};

// Provides a form with a list for selection.
private __gc class ControlSelectionForm : 
   public System::Windows::Forms::Form {
private:
   System::Web::UI::Control*  controlArray[];
public:
   System::Windows::Forms::ListBox*  controlList;

public:
   ControlSelectionForm(System::Web::UI::Control* controlArray[]) {
      this->controlArray = controlArray;
      this->Size = System::Drawing::Size(400, 500);
      this->Text = S"Control Persister Selection Form";

      this->SuspendLayout();

      System::Windows::Forms::Label* label1 = 
         new System::Windows::Forms::Label();
      label1->Text = S"Select the control to persist:";
      label1->Size = System::Drawing::Size(240, 20);
      label1->Location =  Point(10, 10);
      this->Controls->Add(label1);
      controlList = new System::Windows::Forms::ListBox();
      controlList->Size = System::Drawing::Size(370, 400);
      controlList->Location =  Point(10, 30);
      controlList->Anchor = AnchorStyles(AnchorStyles::Left | AnchorStyles::Top |
         AnchorStyles::Bottom | AnchorStyles::Right);
      this->Controls->Add(controlList);

      System::Windows::Forms::Button* okButton = 
         new System::Windows::Forms::Button();
      okButton->Text = S"OK";
      okButton->Size = System::Drawing::Size(80, 24);
      okButton->Location =  Point(this->Width - 100, this->Height - 60);
      okButton->Anchor = AnchorStyles(AnchorStyles::Bottom | AnchorStyles::Right);
      okButton->DialogResult = DialogResult::OK;
      this->Controls->Add(okButton);

      System::Windows::Forms::Button* cancelButton = 
         new System::Windows::Forms::Button();
      cancelButton->Text = S"Cancel";
      cancelButton->Size = System::Drawing::Size(80, 24);
      cancelButton->Location =  Point(this->Width - 200, this->Height - 60);
      cancelButton->Anchor = AnchorStyles(AnchorStyles::Bottom | AnchorStyles::Right);
      cancelButton->DialogResult = DialogResult::Cancel;
      this->Controls->Add(cancelButton);

      for (int i = 0; i < controlArray->Length; i++)
         controlList->Items->Add(controlArray[i]->UniqueID);
      this->ResumeLayout();
   }
};

// Provides a form with a multiline text box for input.
private __gc class StringInputForm : public Form {
public:
   System::Windows::Forms::TextBox*  tbox;

public:
   StringInputForm() {
      this->Size = System::Drawing::Size(400, 400);
      this->Text = S"Input Control Persistence String";

      this->SuspendLayout();
      tbox = new System::Windows::Forms::TextBox();
      tbox->Multiline = true;
      tbox->Size = System::Drawing::Size(this->Width-40, this->Height-90);
      tbox->Text = S"";
      this->Controls->Add(tbox);

      System::Windows::Forms::Button* okButton = 
         new System::Windows::Forms::Button();
      okButton->Text = S"OK";
      okButton->Size = System::Drawing::Size(80, 24);
      okButton->Location =  Point(this->Width - 100, this->Height - 60);
      okButton->Anchor = AnchorStyles(AnchorStyles::Bottom | AnchorStyles::Right);
      okButton->DialogResult = DialogResult::OK;
      this->Controls->Add(okButton);

      System::Windows::Forms::Button* cancelButton = 
         new System::Windows::Forms::Button();
      cancelButton->Text = S"Cancel";
      cancelButton->Size = System::Drawing::Size(80, 24);
      cancelButton->Location =  Point(this->Width - 200, this->Height - 60);
      cancelButton->Anchor = 
         AnchorStyles(AnchorStyles::Bottom | AnchorStyles::Right);
      cancelButton->DialogResult = DialogResult::Cancel;
      this->Controls->Add(cancelButton);

      this->ResumeLayout();
   }
};

// Web control designer provides an interface
// to use the ControlPersister and ControlParser.
public __gc class ControlParserPersisterDesigner : 
   public System::Web::UI::Design::ControlDesigner {
public:
   ControlParserPersisterDesigner() : System::Web::UI::Design::ControlDesigner() {
   }

   // Provides designer verb menu commands to
   // persist a control and to load a persisted control.
public:

   __property System::ComponentModel::Design::DesignerVerbCollection* get_Verbs() {
      DesignerVerbCollection* dvc = new DesignerVerbCollection();
      dvc->Add(new DesignerVerb(S"Load Persisted Control...",
         new EventHandler(this,&ControlParserPersisterDesigner::loadPersistedControl)));
      dvc->Add(new DesignerVerb(S"Parse and Save Control...",
         new EventHandler(this,&ControlParserPersisterDesigner::saveControl)));
      return dvc;
   }

   // Displays a textbox form to receive an HTML
   // String* that represents a control, and creates
   // a toolbox item for the control, if not already
   // present in the selected toolbox category.
private:
   void loadPersistedControl(Object* /*sender*/, EventArgs* /*e*/) {
      // Display a StringInputForm to obtain a persisted control String*.
      StringInputForm* inputForm = new StringInputForm();

      if (inputForm->ShowDialog() != DialogResult::OK)
         return;
      if (inputForm->tbox->Text->Length < 2)
         return;

      // Obtain an IDesignerHost* for the design-mode document.
      IDesignerHost* host = dynamic_cast<IDesignerHost*>
         (this->Component->Site->GetService(__typeof(IDesignerHost)));

      // Create a Web control from the persisted control String*.
      System::Web::UI::Control* ctrl =
         ControlParser::ParseControl(host, inputForm->tbox->Text->Trim());

      // Create a Web control toolbox item for the type of the control
      WebControlToolboxItem* item = new WebControlToolboxItem(ctrl->GetType());

      // Add the Web control toolbox item to the toolbox
      IToolboxService* toolService = dynamic_cast<IToolboxService*>
         (this->Component->Site->GetService(__typeof(IToolboxService)));
      if (toolService != 0)
         toolService->AddToolboxItem(item);
      else
         throw new Exception(S"IToolboxService* was not found.");
   }

   // Displays a list of controls in the project, if any,
   // and displays the HTML representing the persisted, selected control.
private:
   void saveControl(Object* /*sender*/, EventArgs* /*e*/) {
      // Get the collection of components in the current
      // design mode document.
      ComponentCollection* documentComponents =
         this->Component->Site->Container->Components;

      // Filter the components to those that derive from the
      // System::Web::UI::Control class.

      // Create an IComponent* array of the maximum possible length needed.
      IComponent* filterArray [] = new IComponent*[documentComponents->Count];

      // Count the total qualifying components.
      int total = 0;
      for (int i=0; i<documentComponents->Count; i++) {
         // If the component derives from System::Web::UI::Control,
         // copy a reference to the control to the filterArray
         // array and increment the control count.
         if (__typeof(System::Web::UI::Control)->IsAssignableFrom(documentComponents->Item[i]->GetType())) {
            if ((dynamic_cast<System::Web::UI::Control*>(documentComponents->Item[i]))->UniqueID
               != 0) {
                  filterArray->Item[total] = documentComponents->Item[i];
                  total++;
               }
         }
      }

      if (total == 0)
         throw new Exception(S"Document contains no System::Web::UI::Control components.");

      // Move the components that derive from System::Web::UI::Control to a
      // new array of the correct size.
      System::Web::UI::Control* controlArray[] = 
         new System::Web::UI::Control*[total];
      for (int i=0; i<total; i++)
         controlArray->Item[i] = 
         dynamic_cast<System::Web::UI::Control*>(filterArray->Item[i]);

      // Create a ControlSelectionForm to provide a persistence
      // configuration interface.
      ControlSelectionForm* selectionForm = new ControlSelectionForm(controlArray);

      // Display the form.
      if (selectionForm->ShowDialog() != DialogResult::OK)
         return;

      // Validate the selection.
      if (selectionForm->controlList->SelectedIndex == -1)
         throw new Exception(S"You must select a control to persist.");

      // Parse the selected control.
      String* persistedData = 
         ControlPersister::PersistControl( controlArray[selectionForm->controlList->SelectedIndex]);

      // Display the control persistence String* in a text box.
      StringDisplayForm* displayForm = new StringDisplayForm(persistedData);
      displayForm->ShowDialog();
   }
};

// Simple text display control hosts the ControlParserPersisterDesigner.
[DesignerAttribute(__typeof(ControlParserPersisterDesigner), __typeof(IDesigner))]
public __gc class ControlParserPersisterDesignerControl : public WebControl {
private:
   String*  text;
public:
   [Bindable(true),
      Category(S"Appearance"),
      DefaultValue(S"")]
   __property String* get_Text() {
      return text;
   }
   __property void set_Text(String* value) {
      text = value;
   }

public:
   ControlParserPersisterDesignerControl() : WebControl() {
      text = S"Right-click here to access control persistence methods in design mode";
   }

protected:
   void Render(HtmlTextWriter* output) {
      output->Write(Text);
   }
};

[JScript] No example is available for JScript. To view a Visual Basic, C#, or C++ example, click the Language Filter button Language Filter in the upper-left corner of the page.

Requirements

Namespace: System.Web.UI.Design

Platforms: Windows 2000, Windows XP Professional, Windows Server 2003 family

Assembly: System.Design (in System.Design.dll)

See Also

ControlParser Members | System.Web.UI.Design Namespace | Control | ITemplate

Show:
© 2014 Microsoft