Demonstra Passo a passo: Serializar coleções de tipos padrão
Seus controles personalizados às vezes exporão uma coleção como uma propriedade. Este passo a passo demonstra como usar a DesignerSerializationVisibilityAttribute classe para controlar como uma coleção é serializada em tempo de design. A aplicação do Content valor à propriedade collection garante que a propriedade será serializada.
Cuidado
Este conteúdo foi escrito para .NET Framework. Se você estiver usando o .NET 6 ou uma versão posterior, use este conteúdo com cuidado. O sistema de designer foi alterado para o Windows Forms e é importante que você revise as alterações do Designer desde o artigo do .NET Framework .
Para copiar o código neste tópico como uma lista única, consulte Como serializar coleções de tipos padrão com o DesignerSerializationVisibilityAttribute.
Pré-requisitos
É necessário o Visual Studio para concluir este passo a passo.
Criar um controle com uma coleção serializável
A primeira etapa é criar um controle que tem uma coleção serializável como uma propriedade. Você pode editar o conteúdo dessa coleção usando o Editor de Coleção, acessível por meio da janela Propriedades.
No Visual Studio, crie um projeto de biblioteca de controle do Windows e nomeie-o SerializationDemoControlLib.
Renomeie
UserControl1
paraSerializationDemoControl
. Para obter mais informações, consulte Renomear uma refatoração de símbolo de código.Na janela Propriedades, defina o Padding.All valor da propriedade como 10.
Coloque
SerializationDemoControl
um TextBox controle no .Selecione o controle TextBox. Na janela Propriedades, defina as propriedades a seguir.
Propriedade Alterar para Multilinha true
Encaixar Fill ScrollBars Vertical ReadOnly (somente-leitura) true
No Editor de Códigos, declare um campo de matriz de cadeia de caracteres chamado
stringsValue
emSerializationDemoControl
.// 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
Defina a propriedade
Strings
noSerializationDemoControl
.Observação
O Content valor é usado para habilitar a serialização da coleção.
// 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
Pressione F5 para compilar o projeto e executar o controle no contêiner de teste UserControl.
Localize a PropertyGrid propriedade Strings no contêiner de teste UserControl. Selecione a propriedade Strings e, em seguida, selecione o botão de reticências () para abrir o Editor de Coleção de Cadeias de Caracteres.
Insira várias cadeias de caracteres no Editor de Conjunto de Cadeia de Caracteres. Separe-os pressionando a tecla Enter no final de cada cadeia de caracteres. Clique em OK quando terminar de inserir cadeias de caracteres.
Observação
As cadeias de caracteres digitadas aparecem no TextBox arquivo SerializationDemoControl
.
Serializar uma propriedade de coleção
Para testar o comportamento de serialização do seu controle, coloque-o em um formulário e altere o conteúdo da coleção com o Editor de Coleção. Você pode ver o estado da coleção serializada examinando um arquivo de designer especial no qual o Windows Forms Designer emite código.
Adicione um projeto de Aplicativos do Windows à solução. Dê ao projeto o nome de
SerializationDemoControlTest
.Na Caixa de Ferramentas, localize a guia chamada Componentes da SerializationDemoControlLib. Nessa guia, você encontrará o
SerializationDemoControl
. Para mais informações, consulte Instruções passo a passo: preenchendo de forma automática a caixa de ferramentas com componentes personalizados.Coloque um
SerializationDemoControl
em seu formulário.Localize a propriedade
Strings
na janela Propriedades. Clique naStrings
propriedade e, em seguida, clique no botão de reticências () para abrir o Editor de Coleção de Cadeias de Caracteres.Digite várias cadeias de caracteres no Editor de Conjunto de Cadeia de Caracteres. Separe-os pressionando Enter no final de cada cadeia de caracteres. Clique em OK quando terminar de inserir cadeias de caracteres.
Observação
As cadeias de caracteres digitadas aparecem no TextBox arquivo
SerializationDemoControl
.Em Gerenciador de Soluções, clique no botão Mostrar Todos os Arquivos.
Abra o nó Form1. Abaixo está um arquivo chamado Form1.Designer.cs ou Form1.Designer.vb. Este é o arquivo no qual o Designer de Formulários do Windows emite um código que representa o estado de tempo de design do formulário e seus controles filho. Abra esse arquivo no Editor de Códigos.
Abra a região chamada Código gerado pelo Windows Form Designer e localize a seção rotulada como serializationDemoControl1. Sob esse rótulo está o código que representa o estado serializado do seu controle. As cadeias de caracteres que você digitou na etapa 5 aparecem em uma atribuição para a propriedade
Strings
. Os exemplos de código a seguir em C# e Visual Basic, mostram código semelhante ao que você verá se você digitou as cadeias de caracteres "vermelho", "laranja" e "amarelo".this.serializationDemoControl1.Strings = new string[] { "red", "orange", "yellow"};
Me.serializationDemoControl1.Strings = New String() {"red", "orange", "yellow"}
No Editor de códigos, altere o valor do DesignerSerializationVisibilityAttribute na
Strings
propriedade para Hidden.[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Recompile a solução e repita as etapas 3 e 4.
Observação
Neste caso, o Designer de Formulários do Windows não emite nenhuma atribuição para a propriedade Strings
.
Próximas etapas
Se você souber como serializar uma coleção de tipos padrão, considere integrar seus controles personalizados mais profundamente no ambiente de tempo de design. Os tópicos a seguir descrevem como aprimorar a integração do tempo de design de seus controles personalizados:
Confira também
.NET Desktop feedback