Sdílet prostřednictvím


Beispiel für die Eigenschaften eines Serversteuerelements

Aktualisiert: November 2007

Dieses Beispiel zeigt, wie ein Steuerelement mit dem Namen Book erstellt wird, das einfache Eigenschaften sowie Eigenschaften mit untergeordneten Eigenschaften speichert.

Eine einfache Eigenschaft ist eine Eigenschaft vom Typ Zeichenfolge oder von einem Typ, der sich leicht einer Zeichenfolge zuordnen lässt. Eine einfache Eigenschaft wird im Starttag des Steuerelements als Attribut gespeichert, ohne dass Sie etwas tun müssen. Zu den einfachen Eigenschaften gehören Eigenschaften vom Typ String und primitive Werttypen der .NET Framework-Klassenbibliothek, z. B. Boolean, Int16, Int32 und Enum. Sie können Code hinzufügen, um eine einfache Eigenschaft für die Zustandsverwaltung über mehrere Postbacks hinweg im ViewState-Wörterbuch zu speichern.

Eine Eigenschaft wird als komplex bezeichnet, wenn es sich bei dem Eigenschaftentyp um eine Klasse handelt, die selbst über Eigenschaften, so genannte untergeordnete Eigenschaften, verfügt. Z. B. ist der Typ der Font-Eigenschaft von WebControl die FontInfo-Klasse, die selbst über Eigenschaften wie Bold und Name verfügt. Bold und Name sind dann untergeordnete Eigenschaften der Font-Eigenschaft von WebControl. Das ASP.NET-Seitenframework kann untergeordnete Eigenschaften unter Verwendung einer Bindestrichsyntax im Starttag eines Steuerelements speichern (z. B. Font-Bold="true"). Untergeordnete Eigenschaften sind auf der Seite jedoch besser lesbar, wenn sie innerhalb der Tags eines Steuerelements gespeichert werden (z. B. <font Bold="true">).

Um einen visuellen Designer für das Speichern von untergeordneten Eigenschaften als untergeordnete Objekte des Steuerelements zu aktivieren, müssen Sie mehrere Entwurfszeitattribute auf die Eigenschaft und den entsprechenden Typ anwenden. Die standardmäßige Speicherung erfolgt unter Verwendung von Bindestrichattributen im Tag des Steuerelements. Zusätzlich benötigt eine Eigenschaft mit untergeordneten Eigenschaften eine benutzerdefinierte Zustandsverwaltung, um den Ansichtszustand zu verwenden. Weitere Informationen finden Sie im Abschnitt "Codeerläuterung" weiter unten in diesem Thema.

Das in diesem Beispiel definierte Book-Steuerelement ist ein Steuerelement, das in einer Webseite verwendet werden kann, um Informationen über ein Buch in einem Katalog anzuzeigen. Das Book-Steuerelement definiert die folgenden Eigenschaften:

  • Author, eine Eigenschaft mit untergeordneten Eigenschaften vom benutzerdefinierten Typ Author. Der Author-Typ verfügt über eigene Eigenschaften wie FirstName und LastName, bei denen es sich um untergeordnete Eigenschaften der Author-Eigenschaft handelt.

  • BookType, eine einfache Eigenschaft mit der benutzerdefinierten Enumeration BookType als Typ. Die Werte in der BookType-Enumeration lauten z. B. Fiction und NonFiction.

  • CurrencySymbol, eine einfache Eigenschaft vom integrierten Typ String.

  • Price, eine einfache Eigenschaft vom integrierten Typ Decimal.

  • Title, eine einfache Eigenschaft vom integrierten Typ String.

Die Eigenschaften BookType, CurrencySymbol, Price und Title sind sämtlich einfache Eigenschaften und benötigen für die Seitenspeicherung deshalb keine speziellen Attribute. Das Seitenframework speichert diese Eigenschaften standardmäßig als Attribute im Tag des Steuerelements:

<aspSample:Book Title="Wingtip Toys Stories" 
  CurrencySymbol="$" 
  Price="16" 
  BookType="Fiction">
</aspSample:Book>

Die Author-Eigenschaft und die Eigenschaften der Author-Klasse benötigen Entwurfszeitattribute, um die Speicherung innerhalb der Tags des Steuerelements zu aktivieren, wie in folgendem Beispiel gezeigt:

<aspSample:Book >
  <Author FirstName="Judy" LastName="Lew" />
</aspSample:Book>

Das Book-Steuerelement speichert seine einfachen Eigenschaften im ViewState-Wörterbuch. Das Book-Steuerelement muss eine benutzerdefinierte Zustandsverwaltung für die Author-Eigenschaft implementieren, um den Zustand der Eigenschaften über mehrere Postbacks hinweg verwalten zu können.

In einer ausgereiften Implementierung des Book-Steuerelements könnten weitere Eigenschaften für Bücherdaten definiert werden, z. B. der Verlag oder das Erscheinungsdatum. Außerdem könnten Sie die Author-Eigenschaft durch eine Auflistungseigenschaft ersetzen. Weitere Informationen zum Implementieren von Auflistungseigenschaften finden Sie unter Beispiel für eine Auflistungseigenschaft eines Webserversteuerelements.

4s70936s.alert_note(de-de,VS.90).gifHinweis:

Ein Seitenentwickler kann den Ansichtszustand für eine Seite oder für einzelne Steuerelemente in der Seite deaktivieren. Wenn ein Steuerelement für die interne Funktionsfähigkeit einen kritischen Zustand über mehrere Postbacks hinweg aufrechterhalten muss, können Sie den in ASP.NET 2.0 definierten Mechanismus für den Steuerelementzustand verwenden. Der Steuerelementzustand wird in Beispiel für den Vergleich zwischen Steuerelementzustand und Ansichtszustand beschrieben.

Codeauflistung für das Book-Steuerelement

' Book.vb
Option Strict On
Imports System
Imports System.ComponentModel
Imports System.Security.Permissions
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls

Namespace Samples.AspNet.VB.Controls
    < _
    AspNetHostingPermission(SecurityAction.Demand, _
        Level:=AspNetHostingPermissionLevel.Minimal), _
    AspNetHostingPermission(SecurityAction.InheritanceDemand, _
        Level:=AspNetHostingPermissionLevel.Minimal), _
    DefaultProperty("Title"), _
    ToolboxData("<{0}:Book runat=""server""> </{0}:Book>") _
    > _
    Public Class Book
        Inherits WebControl
        Private authorValue As Author
        Private initialAuthorString As String

        < _
        Bindable(True), _
        Category("Appearance"), _
        DefaultValue(""), _
        Description("The name of the author."), _
        DesignerSerializationVisibility( _
            DesignerSerializationVisibility.Content), _
        PersistenceMode(PersistenceMode.InnerProperty) _
        > _
        Public Overridable ReadOnly Property Author() As Author
            Get
                If (authorValue Is Nothing) Then
                    authorValue = New Author()
                End If
                Return authorValue
            End Get
        End Property

        < _
        Bindable(True), _
        Category("Appearance"), _
        DefaultValue(BookType.NotDefined), _
        Description("Fiction or Not") _
        > _
        Public Overridable Property BookType() As BookType
            Get
                Dim t As Object = ViewState("BookType")
                If t Is Nothing Then t = BookType.NotDefined
                Return CType(t, BookType)
            End Get
            Set(ByVal value As BookType)
                ViewState("BookType") = value
            End Set
        End Property

        < _
        Bindable(True), _
        Category("Appearance"), _
        DefaultValue(""), _
        Description("The symbol for the currency."), _
        Localizable(True) _
        > _
        Public Overridable Property CurrencySymbol() As String
            Get
                Dim s As String = CStr(ViewState("CurrencySymbol"))
                If s Is Nothing Then s = String.Empty
                Return s
            End Get
            Set(ByVal value As String)
                ViewState("CurrencySymbol") = value
            End Set
        End Property

        < _
        Bindable(True), _
        Category("Appearance"), _
        DefaultValue("0.00"), _
        Description("The price of the book."), _
        Localizable(True) _
        > _
        Public Overridable Property Price() As Decimal
            Get
                Dim p As Object = ViewState("Price")
                If p Is Nothing Then p = Decimal.Zero
                Return CType(p, Decimal)
            End Get
            Set(ByVal value As Decimal)
                ViewState("Price") = value
            End Set
        End Property

        < _
        Bindable(True), _
        Category("Appearance"), _
        DefaultValue(""), _
        Description("The title of the book."), _
        Localizable(True) _
        > _
        Public Overridable Property Title() As String
            Get
                Dim s As String = CStr(ViewState("Title"))
                If s Is Nothing Then s = String.Empty
                Return s
            End Get
            Set(ByVal value As String)
                ViewState("Title") = value
            End Set
        End Property

        Protected Overrides Sub RenderContents( _
            ByVal writer As HtmlTextWriter)
            writer.RenderBeginTag(HtmlTextWriterTag.Table)

            writer.RenderBeginTag(HtmlTextWriterTag.Tr)
            writer.RenderBeginTag(HtmlTextWriterTag.Td)
            writer.WriteEncodedText(Title)
            writer.RenderEndTag()
            writer.RenderEndTag()

            writer.RenderBeginTag(HtmlTextWriterTag.Tr)
            writer.RenderBeginTag(HtmlTextWriterTag.Td)
            writer.WriteEncodedText(Author.ToString())
            writer.RenderEndTag()
            writer.RenderEndTag()

            writer.RenderBeginTag(HtmlTextWriterTag.Tr)
            writer.RenderBeginTag(HtmlTextWriterTag.Td)
            writer.WriteEncodedText(BookType.ToString())
            writer.RenderEndTag()
            writer.RenderEndTag()

            writer.RenderBeginTag(HtmlTextWriterTag.Tr)
            writer.RenderBeginTag(HtmlTextWriterTag.Td)
            writer.Write(CurrencySymbol)
            writer.Write("&nbsp")
            writer.Write(String.Format("{0:F2}", Price))
            writer.RenderEndTag()
            writer.RenderEndTag()

            writer.RenderEndTag()
        End Sub

        Protected Overrides Sub LoadViewState( _
            ByVal savedState As Object)
            MyBase.LoadViewState(savedState)
            Dim auth As Author = CType(ViewState("Author"), Author)
            If auth IsNot Nothing Then
                authorValue = auth
            End If
        End Sub

        Protected Overrides Function SaveViewState() As Object
            If authorValue IsNot Nothing Then
                Dim currentAuthorString As String = _
                    authorValue.ToString()
                If Not _
                    (currentAuthorString.Equals(initialAuthorString)) Then
                    ViewState("Author") = authorValue
                End If
            End If
            Return MyBase.SaveViewState()
        End Function

        Protected Overrides Sub TrackViewState()
            If authorValue IsNot Nothing Then
                initialAuthorString = authorValue.ToString()
            End If
            MyBase.TrackViewState()
        End Sub

    End Class
End Namespace
// Book.cs
using System;
using System.ComponentModel;
using System.Security.Permissions;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Samples.AspNet.CS.Controls
{
    [
    AspNetHostingPermission(SecurityAction.Demand,
        Level = AspNetHostingPermissionLevel.Minimal),
    AspNetHostingPermission(SecurityAction.InheritanceDemand, 
        Level=AspNetHostingPermissionLevel.Minimal),
    DefaultProperty("Title"),
    ToolboxData("<{0}:Book runat=\"server\"> </{0}:Book>")
    ]
    public class Book : WebControl
    {
        private Author authorValue;
        private String initialAuthorString;

        [
        Bindable(true),
        Category("Appearance"),
        DefaultValue(""),
        Description("The name of the author."),
        DesignerSerializationVisibility(
            DesignerSerializationVisibility.Content),
        PersistenceMode(PersistenceMode.InnerProperty),
        ]
        public virtual Author Author
        {
            get
            {
                if (authorValue == null)
                {
                    authorValue = new Author();
                }
                return authorValue;
            }

        }

        [
        Bindable(true),
        Category("Appearance"),
        DefaultValue(BookType.NotDefined),
        Description("Fiction or Not"),
        ]
        public virtual BookType BookType
        {
            get
            {
                object t = ViewState["BookType"];
                return (t == null) ? BookType.NotDefined : (BookType)t;
            }
            set
            {
                ViewState["BookType"] = value;
            }
        }

        [
        Bindable(true),
        Category("Appearance"),
        DefaultValue(""),
        Description("The symbol for the currency."),
        Localizable(true)
        ]
        public virtual string CurrencySymbol
        {
            get
            {
                string s = (string)ViewState["CurrencySymbol"];
                return (s == null) ? String.Empty : s;
            }
            set
            {
                ViewState["CurrencySymbol"] = value;
            }
        }


        [
        Bindable(true),
        Category("Appearance"),
        DefaultValue("0.00"),
        Description("The price of the book."),
        Localizable(true)
        ]
        public virtual Decimal Price
        {
            get
            {
                object price = ViewState["Price"];
                return (price  == null) ? Decimal.Zero : (Decimal)price;
            }
            set
            {
                ViewState["Price"] = value;
            }
        }

        [
        Bindable(true),
        Category("Appearance"),
        DefaultValue(""),
        Description("The title of the book."),
        Localizable(true)
        ]
        public virtual string Title
        {
            get
            {
                string s = (string)ViewState["Title"];
                return (s == null) ? String.Empty : s;
            }
            set
            {
                ViewState["Title"] = value;
            }
        }

        protected override void RenderContents(HtmlTextWriter writer)
        {
            writer.RenderBeginTag(HtmlTextWriterTag.Table);

            writer.RenderBeginTag(HtmlTextWriterTag.Tr);
            writer.RenderBeginTag(HtmlTextWriterTag.Td);
            writer.WriteEncodedText(Title);
            writer.RenderEndTag();
            writer.RenderEndTag();

            writer.RenderBeginTag(HtmlTextWriterTag.Tr);
            writer.RenderBeginTag(HtmlTextWriterTag.Td);
            writer.WriteEncodedText(Author.ToString());
            writer.RenderEndTag();
            writer.RenderEndTag();

            writer.RenderBeginTag(HtmlTextWriterTag.Tr);
            writer.RenderBeginTag(HtmlTextWriterTag.Td);
            writer.WriteEncodedText(BookType.ToString());
            writer.RenderEndTag();
            writer.RenderEndTag();

            writer.RenderBeginTag(HtmlTextWriterTag.Tr);
            writer.RenderBeginTag(HtmlTextWriterTag.Td);
            writer.Write(CurrencySymbol);
            writer.Write("&nbsp;");
            writer.Write(String.Format("{0:F2}", Price));
            writer.RenderEndTag();
            writer.RenderEndTag();

            writer.RenderEndTag();
        }

        protected override void LoadViewState(object savedState)
        {
            base.LoadViewState(savedState);

            Author auth = (Author)ViewState["Author"];
            if (auth != null)
            {
                authorValue = auth;
            }
        }

        protected override object SaveViewState()
        {
            if (authorValue != null)
            {
                String currentAuthorString = authorValue.ToString();
                if (!(currentAuthorString.Equals(initialAuthorString)))
                {
                    ViewState["Author"] = authorValue;
                }
            }

            return base.SaveViewState();
        }

        protected override void TrackViewState()
        {
            if (authorValue != null)
            {
                initialAuthorString = authorValue.ToString();
            }
            base.TrackViewState();
        }

    }
}

Codeerläuterung

Die auf die Author-Eigenschaft des Book-Steuerelements angewendeten Attribute DesignerSerializationVisibilityAttribute und PersistenceModeAttribute werden in Beispiel für eine Auflistungseigenschaft eines Webserversteuerelements beschrieben. Die Attribute sind für die Serialisierung erforderlich und speichern die Eigenschaften der Author-Klasse.

Der Ansichtszustandsmechanismus ist die Technik, mit der ASP.NET den Zustand über mehrere Postbacks hinweg aufrechterhält. Der Mechanismus serialisiert am Ende der Seitenverarbeitung den Zustand und die Steuerelementstruktur einer Seite in Zeichenfolgendarstellungen und deserialisiert die Zeichenfolge beim Postback. Standardmäßig werden die Zeichenfolgen als verborgene Felder von der Seite an den Browser gesendet. Weitere Informationen finden Sie unter Übersicht über die ASP.NET-Zustandsverwaltung.

Um den Zustand einer einfachen Eigenschaft zu verwalten, definieren Sie sie als Eigenschaft mit Lese-/Schreibzugriff, die in der ViewState-Eigenschaft des Steuerelements gespeichert ist. Auf diese Weise definiert auch das Book-Steuerelement seine einfachen Eigenschaften (BookType, CurrencySymbol, Price und Title). Die in der ViewState-Eigenschaft gespeicherten Zustände der Eigenschaften werden automatisch verwaltet.

Um eine Eigenschaft mit untergeordneten Eigenschaften zu verwalten, können Sie die Eigenschaft als schreibgeschützt definieren und den Zustand des Objekts mithilfe von selbstgeschriebenem Code verwalten. Dazu müssen Sie die beiden folgenden Methoden überschreiben:

Der Typ der ViewState-Eigenschaft, StateBag, ist ein Wörterbuch mit integrierter Zustandsverwaltung. Die StateBag-Klasse implementiert die IStateManager-Schnittstelle, die die Methoden TrackViewState, SaveViewState und LoadViewState definiert. Die StateBag-Klasse implementiert diese Methoden, um nach der Initialisierung mit dem Verfolgen der Änderungen von Steuerelementeigenschaften zu beginnen, die geänderten Elemente am Ende der Seitenanforderung zu speichern und den gespeicherten Zustand beim Postback in die Elemente zu laden. Zum Verfolgen der Elemente markiert StateBag ein Element als geändert, wenn das Element festgelegt wird, nachdem bei einer Seitenanforderung die OnInit-Methode ausgeführt wurde. Wenn beispielsweise nach der Seiteninitialisierung die Title-Eigenschaft des Book-Steuerelements durch Code festgelegt wird, hat dies eine Änderung von ViewState["Title"] zur Folge. Entsprechend wird der unter dem "Title"-Schlüssel in ViewState gespeicherte Wert als geändert markiert. Weitere Informationen finden Sie unter Übersicht über den Lebenszyklus von ASP.NET-Seiten.

Das Book-Steuerelement definiert die Author-Eigenschaft als eine schreibgeschützte Eigenschaft und implementiert die benutzerdefinierte Zustandsverwaltung wie folgt:

  • In der TrackViewState-Methode speichert das Book-Steuerelement zuerst den Anfangswert der Author-Eigenschaft als Zeichenfolge und beginnt anschließend mit der Zustandsverfolgung durch Aufrufen der TrackViewState-Methode der Basisklasse.

  • In der SaveViewState-Methode bestimmt das Book-Steuerelement, ob sich der Anfangswert der Author-Eigenschaft geändert hat. Wenn sich die Eigenschaft geändert hat, speichert Book die Author-Eigenschaft im ViewState-Wörterbuch unter dem Schlüssel "Author" ab. Das Book-Steuerelement ruft anschließend die SaveViewState-Methode der Basisklasse auf. Da die Zustandsverfolgung aktiviert ist, wird das in ViewState gespeicherte Author-Objekt automatisch als geändert markiert und als Teil des Ansichtszustands der Basisklasse gespeichert.

  • In LoadViewState ruft das Book-Steuerelement zuerst die LoadViewState-Methode der Basisklasse auf. Dieser Aufruf stellt das ViewState-Wörterbuch automatisch wieder her. Das Book-Steuerelement bestimmt anschließend, ob das ViewState-Wörterbuch über ein unter "Author" gespeichertes Element verfügt. Wenn dies der Fall ist, lädt das Steuerelement den Ansichtszustandswert in die Author-Eigenschaft.

Der Author-Typ (definiert in der folgenden Codeauflistung) verfügt über einen benutzerdefinierten Typkonverter, mit dessen Hilfe eine Author-Instanz im Ansichtszustand gespeichert werden kann. Der Typkonverter konvertiert eine Author-Instanz in eine Zeichenfolge und umgekehrt. Durch Definieren eines Typkonverters können die untergeordneten Eigenschaften von Author in einem visuellen Designer festgelegt werden. Der benutzerdefinierte Typkonverter wird in Beispiel für einen Typkonverter beschrieben. Die im Ansichtszustand speicherbaren Typen sind durch die LosFormatter-Klasse begrenzt, die ASP.NET zur Ansichtszustandsserialisierung verwendet. Die am effizientesten zu serialisierenden Typen sind der String-Typ, primitive Werttypen der .NET Framework-Klassenbibliothek wie Boolean, Int16, Int32, Enum, Pair, Triplet, Array, ArrayList und Hashtable sowie alle Typen, die diese primitiven Typen enthalten. Zusätzlich können Sie auch benutzerdefinierte Typen mit entsprechend definierten Typkonvertern im Ansichtszustand speichern. Dazu gehören Pair, Triplet, Array, ArrayList und Hashtable. Wenn Sie die Ansichtszustandsserialisierung für ein Steuerelement definieren, müssen Sie die Steuerelementdaten in einen dieser Typen konvertieren. Wenn Sie Typen im Ansichtszustand speichern, die nicht mit dem Mechanismus der Ansichtszustandsserialisierung kompatibel sind, wird das Steuerelement zwar möglicherweise kompiliert, doch zur Laufzeit löst es dann einen Fehler aus. Schließlich können serialisierbare Typen (d. h. Typen, die die ISerializable-Schnittstelle implementieren oder mit SerializableAttribute markiert sind) im Ansichtszustand gespeichert werden. Doch für diese Typen ist die Serialisierung wesentlich langsamer als für primitive Typen.

Das Zustandsobjekt, das ein Steuerelement in die Serialisierung einbringt, ist der Ansichtszustand des Steuerelements. Die ViewState-Eigenschaft eines Steuerelements ist nur ein Teil des Ansichtszustands eines Steuerelements – und zwar der Teil, der ohne Ihr Zutun am Ansichtszustandsmechanismus teilnimmt. Die Control-Klasse implementiert die Logik für das Speichern und Laden der geänderten Elemente im ViewState-Wörterbuch in ihrer SaveViewState-Methode und in ihrer LoadViewState -Methode. Der übrige Teil bzw. die übrigen Teile des Ansichtszustands sind zusätzliche Objekte, die Sie (bzw. die Basisklasse des Steuerelements) im Ansichtszustand speichern können, indem Sie die SaveViewState-Methode überschreiben. Wenn Sie die SaveViewState-Methode und die LoadViewState-Methode überschreiben, müssen Sie die entsprechenden Methoden der Basisklasse aufrufen.

Codeauflistung für die Author-Klasse

Das Anwenden von NotifyParentPropertyAttribute auf die Eigenschaften FirstName, LastName und MiddleName und das Festlegen des Attributkonstruktors auf true hat zur Folge, dass der visuelle Designer Änderungen dieser Eigenschaften an die entsprechenden übergeordneten Eigenschaften (eine Author-Instanz) weitergibt und dorthinein serialisiert.

' Author.vb
Option Strict On
Imports System
Imports System.Collections
Imports System.ComponentModel
Imports System.Globalization
Imports System.Web.UI

Namespace Samples.AspNet.VB.Controls
    < _
    TypeConverter(GetType(AuthorConverter)) _
    > _
    Public Class Author
        Dim firstNameValue As String
        Dim lastNameValue As String
        Dim middleNameValue As String

        Public Sub New()
            Me.New(String.Empty, String.Empty, String.Empty)
        End Sub

        Public Sub New(ByVal firstname As String, _
            ByVal lastname As String)
            Me.New(firstname, String.Empty, lastname)
        End Sub

        Public Sub New(ByVal firstname As String, _
            ByVal middlename As String, ByVal lastname As String)
            firstNameValue = firstname
            middleNameValue = middlename
            lastNameValue = lastname
        End Sub

        < _
        Category("Behavior"), _
        DefaultValue(""), _
        Description("First name of author."), _
        NotifyParentProperty(True) _
        > _
        Public Overridable Property FirstName() As String
            Get
                Return firstNameValue
            End Get
            Set(ByVal value As String)
                firstNameValue = value
            End Set
        End Property


        < _
        Category("Behavior"), _
        DefaultValue(""), _
        Description("Last name of author."), _
        NotifyParentProperty(True) _
        > _
        Public Overridable Property LastName() As String
            Get
                Return lastNameValue
            End Get
            Set(ByVal value As String)
                lastNameValue = value
            End Set
        End Property

        < _
        Category("Behavior"), _
        DefaultValue(""), _
        Description("Middle name of author."), _
            NotifyParentProperty(True) _
        > _
        Public Overridable Property MiddleName() As String
            Get
                Return middleNameValue
            End Get
            Set(ByVal value As String)
                middleNameValue = value
            End Set
        End Property

        Public Overrides Function ToString() As String
            Return ToString(CultureInfo.InvariantCulture)
        End Function

        Public Overloads Function ToString( _
            ByVal culture As CultureInfo) As String
            Return TypeDescriptor.GetConverter( _
                Me.GetType()).ConvertToString(Nothing, culture, Me)
        End Function
    End Class
End Namespace
// Author.cs
using System;
using System.Collections;
using System.ComponentModel;
using System.Globalization;
using System.Web.UI;

namespace Samples.AspNet.CS.Controls
{
    [
    TypeConverter(typeof(AuthorConverter))
    ]
    public class Author
    {
        private string firstnameValue;
        private string lastnameValue;
        private string middlenameValue;

        public Author()
            :
            this(String.Empty, String.Empty, String.Empty)
        {
        }

        public Author(string firstname, string lastname)
            :
            this(firstname, String.Empty, lastname)
        {
        }

        public Author(string firstname, 
                    string middlename, string lastname)
        {
            firstnameValue = firstname;
            middlenameValue = middlename;
            lastnameValue = lastname;
        }

        [
        Category("Behavior"),
        DefaultValue(""),
        Description("First name of author."),
        NotifyParentProperty(true),
        ]
        public virtual String FirstName
        {
            get
            {
                return firstnameValue;
            }
            set
            {
                firstnameValue = value;
            }
        }

        [
        Category("Behavior"),
        DefaultValue(""),
        Description("Last name of author."),
        NotifyParentProperty(true)
        ]
        public virtual String LastName
        {
            get
            {
                return lastnameValue;
            }
            set
            {
                lastnameValue = value;
            }
        }

        [
        Category("Behavior"),
        DefaultValue(""),
        Description("Middle name of author."),
        NotifyParentProperty(true)
        ]
        public virtual String MiddleName
        {
            get
            {
                return middlenameValue;
            }
            set
            {
                middlenameValue = value;
            }
        }

        public override string ToString()
        {
            return ToString(CultureInfo.InvariantCulture);
        }

        public string ToString(CultureInfo culture)
        {
            return TypeDescriptor.GetConverter(
                GetType()).ConvertToString(null, culture, this);
        }
    }
}

Codeauflistung für die BookType-Enumeration

' BookType.vb
Option Strict On
Imports System

Namespace Samples.AspNet.VB.Controls
    Public Enum BookType
        NotDefined = 0
        Fiction = 1
        NonFiction = 2
    End Enum
End Namespace
// BookType.cs
using System;

namespace Samples.AspNet.CS.Controls
{
    public enum BookType
    {
        NotDefined = 0,
        Fiction = 1,
        NonFiction = 2
    }
}

Testseite für das Book-Steuerelement

Das folgende Beispiel zeigt eine ASPX-Seite, die das Book-Steuerelement verwendet.

<%@ Page Language="C#" Debug="true" Trace="true"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
  void Button_Click(object sender, EventArgs e)
  {
    Book1.Author.FirstName = "Bob";
    Book1.Author.LastName = "Kelly";
    Book1.Title = "Contoso Stories";
    Book1.Price = 39.95M;
    Button1.Visible = false;
  }  
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
  <head id="Head1" runat="server">
    <title>
      Book test page
    </title>
  </head>
  <body>
    <form id="Form1" runat="server">
      <aspSample:Book ID="Book1" Runat="server"  
        Title="Tailspin Toys Stories" CurrencySymbol="$" 
        BackColor="#FFE0C0" Font-Names="Tahoma" 
        Price="16" BookType="Fiction">
        <Author FirstName="Judy" LastName="Lew" />
      </aspSample:Book>
      <br />
      <asp:Button ID="Button1" OnClick="Button_Click" 
        Runat="server" Text="Change" />
      <asp:Button ID="Button2" Runat="server" Text="Refresh" />
      <br />
      <br />
      <asp:HyperLink ID="Hyperlink1" href="BookTest.aspx" 
        Runat="server">
        Reload Page</asp:HyperLink>
    </form>
  </body>
</html>

Erstellen und Verwenden des Beispiels

Kompilieren Sie die Klassen aus diesem Beispiel mit der in Beispiel für einen Typkonverter beschriebenen AuthorConverter-Klasse.

Weitere Informationen über das Kompilieren und Verwenden der benutzerdefinierten Beispielsteuerelemente finden Sie unter Erstellen der Beispiele für benutzerdefinierte Serversteuerelemente.

Siehe auch

Konzepte

Werttypen im allgemeinen Typsystem

Referenz

IsPrimitive

Weitere Ressourcen

Entwickeln von benutzerdefinierten ASP.NET-Serversteuerelementen