Sdílet prostřednictvím


Návod: Serializace kolekcí standardních typů

Vlastní ovládací prvky někdy zpřístupňují kolekci jako vlastnost. Tento návod ukazuje, jak použít třídu DesignerSerializationVisibilityAttribute ke kontrole způsobu serializace kolekce v době návrhu. Použití hodnoty Content na vlastnost kolekce zajišťuje, že vlastnost bude serializována.

Opatrnost

Tento obsah byl napsán pro rozhraní .NET Framework. Pokud používáte .NET 6 nebo novější verzi, použijte tento obsah s opatrností. Systém návrháře se změnil pro Windows Forms a je důležité, abyste si prošli změny návrháře od verze .NET Framework článku.

Pokud chcete zkopírovat kód v tomto tématu jako jeden výpis, přečtěte si Postupy: Serializace kolekcí standardních typů pomocí DesignerSerializationVisibilityAttribute.

Požadavky

K dokončení tohoto návodu potřebujete Visual Studio.

Vytvoření ovládacího prvku s serializovatelnou kolekcí

Prvním krokem je vytvoření ovládacího prvku, který má serializovatelnou kolekci jako vlastnost. Obsah této kolekce můžete upravit pomocíeditoru kolekcí , ke kterému máte přístup z okna Vlastnosti.

  1. V sadě Visual Studio vytvořte projekt knihovny ovládacích prvků systému Windows a pojmenujte ho SerializationDemoControlLib.

  2. Přejmenujte UserControl1 na SerializationDemoControl. Další informace najdete v tématu Přejmenování refaktoringu symbolu kódu.

  3. V okně Vlastnosti nastavte hodnotu vlastnosti Padding.All na 10.

  4. Umístěte ovládací prvek TextBox do SerializationDemoControl.

  5. Vyberte ovládací prvek TextBox. V okně Vlastnosti nastavte následující vlastnosti.

    Vlastnost Změnit na
    víceřádkové true
    Dock Fill
    posuvníky Vertical
    jen pro čtení true
  6. V editoru kódu deklarujte pole typu řetězců s názvem stringsValue v 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. Definujte vlastnost Strings v SerializationDemoControl.

    Poznámka

    Hodnota Content slouží k povolení serializace kolekce.

        // 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. Stisknutím klávesy F5 sestavte projekt a spusťte ovládací prvek v kontejneruUserControl Test Container .

  9. Vyhledejte vlastnost Řetězce v PropertyGrid kontejneru UserControl Test container. Vyberte vlastnost Řetězce, a potom tlačítko se třemi tečkami (Tlačítko se třemi tečkami (...) v okně Vlastnosti v sadě Visual Studio), abyste otevřeli editor kolekce řetězců .

  10. Zadejte několik řetězců do editoru Kolekce řetězců . Oddělte je stisknutím klávesy Enter na konci každého řetězce. Po dokončení zadávání řetězců klikněte na OK.

Poznámka

Řetězce, které jste zadali, se zobrazí v TextBox přístroje SerializationDemoControl.

Serializovat vlastnost kolekce

Pro testování chování serializace ovládacího prvku jej umístíte na formulář a obsah kolekce změníte pomocí Editoru kolekce. Stav serializované kolekce můžete zobrazit tak, že se podíváte na speciální soubor návrháře, do kterého Windows Forms Designer generuje kód.

  1. Přidejte do řešení projekt aplikace systému Windows. Pojmenujte projekt SerializationDemoControlTest.

  2. V panelu nástrojů vyhledejte kartu s názvemSerializationDemoControlLib Components. Na této kartě najdete SerializationDemoControl. Další informace naleznete v tématu Návod: Automatické naplnění sady nástrojů vlastními komponentami.

  3. Umístěte SerializationDemoControl do formuláře.

  4. Najděte vlastnost Strings v okně Vlastnosti. Klikněte na vlastnost Strings a potom klikněte na tři tečky (Tlačítko se třemi tečkami (...) v okně Vlastnosti sady Visual Studio.) pro otevření editoru kolekce řetězců.

  5. Do editoru kolekce řetězců zadejte několik řetězců. Oddělte je stisknutím klávesy Enter na konci každého řetězce. Po dokončení zadávání řetězců klikněte na OK.

    Poznámka

    Zadané řetězce se zobrazí v TextBox, SerializationDemoControl.

  6. V Průzkumníku řešeníklikněte na tlačítko Zobrazit všechny soubory.

  7. Otevřete uzel Form1. Pod ním je soubor s názvem Form1.Designer.cs nebo Form1.Designer.vb. Toto je soubor, do kterého Windows Forms Designer generuje kód představující stav návrhu formuláře a jeho podřízených ovládacích prvků. Otevřete tento soubor v editoru kódu.

  8. Otevřete oblast s názvem kód generovaný návrhářem formulářů Windows a vyhledejte oddíl označený serializationDemoControl1. Pod tímto popiskem je kód představující serializovaný stav vašeho ovládacího prvku. Řetězce, které jste zadali v kroku 5, se zobrazí v přiřazení k vlastnosti Strings. Následující příklady kódu v jazyce C# a Visual Basic ukazují kód podobný tomu, co uvidíte, pokud jste zadali řetězce "červená", "oranžová" a "žlutá".

    this.serializationDemoControl1.Strings = new string[] {
            "red",
            "orange",
            "yellow"};
    
    Me.serializationDemoControl1.Strings = New String() {"red", "orange", "yellow"}
    
  9. V editoru kódu změňte hodnotu DesignerSerializationVisibilityAttribute vlastnosti Strings na Hidden.

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    
    <DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
    
  10. Znovu sestavte řešení a zopakujte kroky 3 a 4.

Poznámka

V tomto případě Windows Forms Designer nevygeneruje přiřazení vlastnosti Strings.

Další kroky

Jakmile víte, jak serializovat kolekci standardních typů, zvažte hlubší integraci vlastních ovládacích prvků do prostředí návrhu. Následující témata popisují, jak vylepšit integraci vlastních ovládacích prvků v době návrhu:

Viz také