Dela via


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.

  1. Skapa ett Windows Control Library-projekt i Visual Studio och ge det namnet SerializationDemoControlLib.

  2. Byt namn på UserControl1 till SerializationDemoControl. Mer information finns i Byt namn på en kodsymbol som omstrukturerar.

  3. I fönstret Egenskaper anger du värdet för egenskapen Padding.All till 10.

  4. Placera en TextBox kontroll i SerializationDemoControl.

  5. Välj kontrollen TextBox. I fönstret Egenskaper anger du följande egenskaper.

    Egenskap Ändra till
    Multiradig true
    Dock Fill
    rullningslister Vertical
    Skrivskyddad true
  6. I Code Editordeklarerar du ett strängmatrisfält med namnet stringsValue i SerializationDemoControl.

        // 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
    
  7. Definiera egenskapen StringsSerializationDemoControl.

    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
    
  8. Tryck på F5 för att skapa projektet och kör kontrollen i UserControl-testcontainern.

  9. Leta reda på egenskapen Strings i PropertyGrid för UserControl-testcontainern. Välj egenskapen Strängar och välj sedan ellipsknappen (ellipsknappen (...) i Egenskapsfönstret i Visual Studio) för att öppna Strängsamlingsredigeraren.

  10. 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.

  1. Lägg till ett Windows-programprojekt i lösningen. Ge projektet namnet SerializationDemoControlTest.

  2. 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.

  3. Placera en SerializationDemoControl i formuläret.

  4. Leta upp egenskapen Strings i fönstret Egenskaper. Klicka på egenskapen Strings och klicka sedan på ellipsen (knappen Ellips (...) i fönstret Egenskaper i Visual Studio.) för att öppna String Collection Editor.

  5. 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.

  6. I Solution Explorerklickar du på knappen Visa alla filer.

  7. Ö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.

  8. Ö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"}
    
  9. I Code Editorändrar du värdet för DesignerSerializationVisibilityAttribute på egenskapen Strings till Hidden.

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    
    <DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
    
  10. Å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:

Se även