Genomgång: Serialisera samlingar av standardtyper
Dina anpassade kontroller exponerar ibland en samling som en egenskap. Den här genomgången visar hur du använder klassen DesignerSerializationVisibilityAttribute för att styra hur en samling serialiseras vid designtillfället. Om du använder värdet Content på din samlingsegenskap ser du till att egenskapen serialiseras.
Försiktighet
Det här innehållet skrevs för .NET Framework. Om du använder .NET 6 eller en senare version använder du det här innehållet med försiktighet. Designersystemet har ändrats för Windows Forms och det är viktigt att du granskar Designer-ändringarna sedan artikeln om .NET Framework.
Om du vill kopiera koden i det här avsnittet som en enda lista kan du läsa How to: Serialize Collections of Standard Types with the DesignerSerializationVisibilityAttribute.
Förutsättningar
Du behöver Visual Studio för att slutföra den här genomgången.
Skapa en kontroll med en serialiserbar samling
Det första steget är att skapa en kontroll som har en serialiserbar samling som en egenskap. Du kan redigera innehållet i den här samlingen med hjälp av Collection Editor, som du kan komma åt från fönstret Egenskaper.
Skapa ett Windows Control Library-projekt i Visual Studio och ge det namnet SerializationDemoControlLib.
Byt namn på
UserControl1
tillSerializationDemoControl
. Mer information finns i Byt namn på en kodsymbol som omstrukturerar.I fönstret Egenskaper anger du värdet för egenskapen Padding.All till 10.
Placera en TextBox kontroll i
SerializationDemoControl
.Välj kontrollen TextBox. I fönstret Egenskaper anger du följande egenskaper.
Egenskap Ändra till Multiradig true
Dock Fill rullningslister Vertical Skrivskyddad true
I Code Editordeklarerar du ett strängmatrisfält med namnet
stringsValue
iSerializationDemoControl
.// This field backs the Strings property. private: array<String^>^ stringsValue;
// This field backs the Strings property. private String[] stringsValue = new String[1];
' This field backs the Strings property. Private stringsValue(1) As String
Definiera egenskapen
Strings
påSerializationDemoControl
.Notera
Värdet Content används för att aktivera serialisering av samlingen.
// When the DesignerSerializationVisibility attribute has // a value of "Content" or "Visible" the designer will // serialize the property. This property can also be edited // at design time with a CollectionEditor. public: [DesignerSerializationVisibility( DesignerSerializationVisibility::Content)] property array<String^>^ Strings { array<String^>^ get() { return this->stringsValue; } void set(array<String^>^ value) { this->stringsValue = value; // Populate the contained TextBox with the values // in the stringsValue array. StringBuilder^ sb = gcnew StringBuilder(this->stringsValue->Length); for (int i = 0; i < this->stringsValue->Length; i++) { sb->Append(this->stringsValue[i]); sb->Append(Environment::NewLine); } this->demoControlTextBox->Text = sb->ToString(); } }
// When the DesignerSerializationVisibility attribute has // a value of "Content" or "Visible" the designer will // serialize the property. This property can also be edited // at design time with a CollectionEditor. [DesignerSerializationVisibility( DesignerSerializationVisibility.Content )] public String[] Strings { get { return this.stringsValue; } set { this.stringsValue = value; // Populate the contained TextBox with the values // in the stringsValue array. StringBuilder sb = new StringBuilder(this.stringsValue.Length); for (int i = 0; i < this.stringsValue.Length; i++) { sb.Append(this.stringsValue[i]); sb.Append("\r\n"); } this.textBox1.Text = sb.ToString(); } }
' When the DesignerSerializationVisibility attribute has ' a value of "Content" or "Visible" the designer will ' serialize the property. This property can also be edited ' at design time with a CollectionEditor. <DesignerSerializationVisibility( _ DesignerSerializationVisibility.Content)> _ Public Property Strings() As String() Get Return Me.stringsValue End Get Set(ByVal value As String()) Me.stringsValue = Value ' Populate the contained TextBox with the values ' in the stringsValue array. Dim sb As New StringBuilder(Me.stringsValue.Length) Dim i As Integer For i = 0 To (Me.stringsValue.Length) - 1 sb.Append(Me.stringsValue(i)) sb.Append(ControlChars.Cr + ControlChars.Lf) Next i Me.textBox1.Text = sb.ToString() End Set End Property
Tryck på F5 för att skapa projektet och kör kontrollen i UserControl-testcontainern.
Leta reda på egenskapen Strings i PropertyGrid för UserControl-testcontainern. Välj egenskapen Strängar och välj sedan ellipsknappen (
) för att öppna Strängsamlingsredigeraren.
Ange flera strängar i Strängsamlingsredigeraren. Separera dem genom att trycka på Retur vid slutet av varje sträng. Klicka på OK när du är klar med att ange strängar.
Note
Strängarna som du skrev visas i TextBox i SerializationDemoControl
.
Serialisera en samlingsegenskap
Om du vill testa serialiseringsbeteendet för kontrollen placerar du den i ett formulär och ändrar innehållet i samlingen med Collection Editor. Du kan se det serialiserade samlingstillståndet genom att titta på en särskild designerfil där Windows Forms Designer genererar kod.
Lägg till ett Windows-programprojekt i lösningen. Ge projektet namnet
SerializationDemoControlTest
.I Toolboxhittar du fliken med namnet SerializationDemoControlLib Components. På den här fliken hittar du
SerializationDemoControl
. Mer information finns i Genomgång: Fyll verktygslådan automatiskt med anpassade komponenter.Placera en
SerializationDemoControl
i formuläret.Leta upp egenskapen
Strings
i fönstret Egenskaper. Klicka på egenskapenStrings
och klicka sedan på ellipsen () för att öppna String Collection Editor.
Skriv flera strängar i String Collection Editor. Avgränsa dem genom att trycka på Ange i slutet av varje sträng. Klicka på OK när du är klar med att ange strängar.
Not
Strängarna som du skrev visas i TextBox för
SerializationDemoControl
.I Solution Explorerklickar du på knappen Visa alla filer.
Öppna noden Form1. Under den finns en fil som heter Form1.Designer.cs eller Form1.Designer.vb. Det här är filen i vilken Windows Forms Designer genererar kod som representerar designläget för ditt formulär och dess barnkontroller. Öppna den här filen i Code Editor.
Öppna regionen med namnet Windows Form Designer-genererad kod och leta reda på avsnittet med etiketten serialiseringDemoControl1. Under den här etiketten finns koden som representerar kontrollens serialiserade tillstånd. Strängarna som du skrev i steg 5 visas i en tilldelning till egenskapen
Strings
. Följande kodexempel i C# och Visual Basic visar kod som liknar det du ser om du har skrivit strängarna "röd", "orange" och "gul".this.serializationDemoControl1.Strings = new string[] { "red", "orange", "yellow"};
Me.serializationDemoControl1.Strings = New String() {"red", "orange", "yellow"}
I Code Editorändrar du värdet för DesignerSerializationVisibilityAttribute på egenskapen
Strings
till Hidden.[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Återskapa lösningen och upprepa steg 3 och 4.
Not
I det här fallet genererar Windows Forms Designer ingen tilldelning till egenskapen Strings
.
Nästa steg
När du vet hur du serialiserar en samling standardtyper bör du överväga att integrera dina anpassade kontroller djupare i designmiljön. Följande avsnitt beskriver hur du förbättrar designtidsintegrering av dina anpassade kontroller:
översikt över Designer-serialisering
genomgång: Skapa en Windows Forms-kontroll som utnyttjar Visual Studio Design-Time funktioner
Se även
.NET Desktop feedback