Przewodnik: serializowanie kolekcji typów standardowych
Kontrolki niestandardowe będą czasami uwidaczniać kolekcję jako właściwość. W tym przewodniku pokazano, jak używać DesignerSerializationVisibilityAttribute klasy do kontrolowania serializacji kolekcji w czasie projektowania. Content Zastosowanie wartości do właściwości kolekcji gwarantuje, że właściwość zostanie serializowana.
Uwaga
Ta zawartość została napisana dla programu .NET Framework. Jeśli używasz platformy .NET 6 lub nowszej wersji, użyj tej zawartości ostrożnie. System projektanta został zmieniony dla formularzy systemu Windows i ważne jest, aby przejrzeć zmiany Projektant od artykułu .NET Framework.
Aby skopiować kod w tym temacie jako pojedynczą listę, zobacz How to: Serialize Collections of Standard Types with the Projektant SerializationVisibilityAttribute (Instrukcje: serializowanie kolekcji typów standardowych za pomocą atrybutu Projektant SerializationVisibilityAttribute).
Wymagania wstępne
Aby ukończyć ten przewodnik, potrzebny jest program Visual Studio.
Tworzenie kontrolki z kolekcją z możliwością serializacji
Pierwszym krokiem jest utworzenie kontrolki, która ma kolekcję z możliwością serializacji jako właściwość. Zawartość tej kolekcji można edytować przy użyciu Edytora kolekcji, do którego można uzyskać dostęp w oknie Właściwości .
W programie Visual Studio utwórz projekt Biblioteka kontrolek systemu Windows i nadaj mu nazwę SerializationDemoControlLib.
Zmień nazwę
UserControl1
naSerializationDemoControl
. Aby uzyskać więcej informacji, zobacz Zmienianie nazwy refaktoryzacji symbolu kodu.W oknie Właściwości ustaw wartość Padding.All właściwości na 10.
Umieść kontrolkę TextBox w elemecie
SerializationDemoControl
.Wybierz kontrolkę TextBox . W oknie Właściwości ustaw następujące właściwości.
Właściwości Zmień na Wielowierszowego true
Dock Fill Scrollbars Vertical ReadOnly true
W Edytorze kodu zadeklaruj pole tablicy ciągów o nazwie
stringsValue
wSerializationDemoControl
pliku .// 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
Zdefiniuj
Strings
właściwość w obiekcieSerializationDemoControl
.Uwaga
Wartość Content jest używana do włączenia serializacji kolekcji.
// 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
Naciśnij klawisz F5, aby skompilować projekt i uruchomić kontrolkę w kontenerze testowym UserControl.
Znajdź właściwość Strings w PropertyGrid kontenerze testowym UserControl. Wybierz właściwość Ciągi, a następnie wybierz przycisk wielokropka (), aby otworzyć Edytor kolekcji ciągów.
Wprowadź kilka ciągów w Edytorze kolekcji ciągów. Oddziel je, naciskając klawisz Enter na końcu każdego ciągu. Po zakończeniu wprowadzania ciągów kliknij przycisk OK .
Uwaga
Wpisane ciągi są wyświetlane w obiekcie TextBoxSerializationDemoControl
.
Serializowanie właściwości kolekcji
Aby przetestować zachowanie serializacji kontrolki, należy umieścić ją w formularzu i zmienić zawartość kolekcji za pomocą Edytora kolekcji. Można zobaczyć stan serializacji kolekcji, przeglądając specjalny plik projektanta, w którym Projektant programu Windows Forms emituje kod.
Dodaj projekt aplikacji systemu Windows do rozwiązania. Nadaj projektowi
SerializationDemoControlTest
nazwę .W przyborniku znajdź kartę o nazwie SerializationDemoControlLib Components(Składniki biblioteki SerializationDemoControlLib). Na tej karcie znajdziesz element
SerializationDemoControl
. Aby uzyskać więcej informacji, zobacz Przewodnik: automatyczne wypełnianie przybornika za pomocą składników niestandardowych.Umieść element
SerializationDemoControl
w formularzu.Strings
Znajdź właściwość w oknie Właściwości.Strings
Kliknij właściwość, a następnie kliknij przycisk wielokropka (), aby otworzyć Edytor kolekcji ciągów.Wpisz kilka ciągów w Edytorze kolekcji ciągów. Rozdziel je, naciskając klawisz Enter na końcu każdego ciągu. Po zakończeniu wprowadzania ciągów kliknij przycisk OK .
Uwaga
Wpisane ciągi są wyświetlane w obiekcie TextBox
SerializationDemoControl
.W Eksplorator rozwiązań kliknij przycisk Pokaż wszystkie pliki.
Otwórz węzeł Form1. Poniżej znajduje się plik o nazwie Form1.Projektant. cs lub Form1.Projektant. vb. Jest to plik, w którym Projektant formularzy systemu Windows emituje kod reprezentujący stan czasu projektowania formularza i jego kontrolek podrzędnych. Otwórz ten plik w Edytorze kodu.
Otwórz region o nazwie Formularz systemu Windows Projektant wygenerowany kod i znajdź sekcję z etykietą serializationDemoControl1. Pod tą etykietą znajduje się kod reprezentujący serializowany stan kontrolki. Ciągi wpisane w kroku 5 są wyświetlane w przypisaniu do
Strings
właściwości . W poniższych przykładach kodu w językach C# i Visual Basic pokazano kod podobny do tego, co zobaczysz, jeśli wpisać ciągi "czerwony", "pomarańczowy" i "żółty".this.serializationDemoControl1.Strings = new string[] { "red", "orange", "yellow"};
Me.serializationDemoControl1.Strings = New String() {"red", "orange", "yellow"}
W Edytorze kodu zmień wartość DesignerSerializationVisibilityAttribute właściwości Hiddenna
Strings
.[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Ponownie skompiluj rozwiązanie i powtórz kroki 3 i 4.
Uwaga
W takim przypadku Projektant formularzy systemu Windows nie emituje żadnego przypisania do Strings
właściwości .
Następne kroki
Gdy już wiesz, jak serializować kolekcję typów standardowych, rozważ bardziej szczegółowe zintegrowanie niestandardowych kontrolek ze środowiskiem projektowania. W poniższych tematach opisano sposób ulepszania integracji w czasie projektowania kontrolek niestandardowych:
Zobacz też
.NET Desktop feedback