チュートリアル: 標準データ型のコレクションをシリアル化する

カスタム コントロールで、コレクションがプロパティとして公開されることがあります。 このチュートリアルでは、DesignerSerializationVisibilityAttribute クラスを使用して、デザイン時にコレクションをシリアル化する方法を制御する方法を示します。 コレクションのプロパティに値 Content を適用すると、プロパティが確実にシリアル化されます。

注意事項

このコンテンツは .NET Framework 用に作成されました。 .NET 6 以降のバージョンを使用している場合は、このコンテンツの使用には注意が必要です。 Windows フォームのデザイナー システムが変更されたため、.NET Framework 以降のデザイナーの変更に関する記事を確認することが重要です。

このトピックのコードを単一のリストとしてコピーする方法については、「方法: 標準の型のコレクションを DesignerSerializationVisibilityAttribute でシリアル化する」を参照してください。

必須コンポーネント

このチュートリアルを完了するには Visual Studio が必要です。

シリアル化可能なコレクションを使用してコントロールを作成する

最初のステップは、シリアル化可能なコレクションをプロパティとして持つコントロールを作成することです。 このコレクションの内容は、 [プロパティ] ウィンドウからアクセスできるコレクション エディターを使用して編集できます。

  1. Visual Studio で Windows コントロール ライブラリ プロジェクトを作成し、SerializationDemoControlLib という名前を付けます。

  2. UserControl1 の名前を SerializationDemoControl に変更します。 詳しくは、「コード シンボルの名前の変更のリファクタリング」をご覧ください。

  3. [プロパティ] ウィンドウで、Padding.All プロパティの値を 10 に設定します。

  4. TextBox コントロールを SerializationDemoControl 配置します。

  5. TextBox コントロールを選択します。 [プロパティ] ウィンドウで、次のプロパティを設定します。

    プロパティ 変更後の値
    Multiline true
    Dock Fill
    スクロールバー Vertical
    ReadOnly true
  6. コード エディターで、SerializationDemoControlstringsValue という名前の文字列配列フィールドを宣言します。

        // 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. StringsSerializationDemoControl プロパティを定義します。

    注意

    Content は、コレクションのシリアル化を有効にするために使用されます。

        // 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. F5 キーを押してプロジェクトをビルドし、UserControl Test Container でコントロールを実行します。

  9. UserControl Test ContainerPropertyGrid で、Strings プロパティを見つけます。 Strings プロパティを選択し、省略記号 (The Ellipsis button (...) in the Properties window of Visual Studio) ボタンを選択して、文字列コレクション エディターを開きます。

  10. 文字列コレクション エディターにいくつかの文字列を入力します。 各文字列の最後で Enter キーを押して区切ります。 文字列の入力が済んだら、 [OK] をクリックします。

注意

入力した文字列が、SerializationDemoControlTextBox に表示されます。

コレクション プロパティをシリアル化する

コントロールのシリアル化動作をテストするには、それをフォームに配置し、コレクション エディターを使用してコレクションの内容を変更します。 Windows フォーム デザイナーによってコードが出力される特別なデザイナー ファイルを調べることで、シリアル化されたコレクションの状態を確認できます。

  1. Windows アプリケーション プロジェクトをソリューションに追加します。 プロジェクトに SerializationDemoControlTest という名前を付けます。

  2. ツールボックスで、 [SerializationDemoControlLib コンポーネント] という名前のタブを見つけます。 このタブに、SerializationDemoControl があります。 詳細については、「チュートリアル : ツールボックスへのカスタム コンポーネントの自動設定」を参照してください。

  3. SerializationDemoControl をフォームに配置します。

  4. [プロパティ] ウィンドウで Strings プロパティを見つけます。 Strings プロパティをクリックしたら、省略記号 (The Ellipsis button (...) in the Properties window of Visual Studio.) ボタンをクリックして、文字列コレクション エディターを開きます。

  5. 文字列コレクション エディターにいくつかの文字列を入力します。 各文字列の最後で Enter キーを押して区切ります。 文字列の入力が済んだら、 [OK] をクリックします。

    注意

    入力した文字列が、SerializationDemoControlTextBox に表示されます。

  6. ソリューション エクスプローラーで、 [すべてのファイルを表示] ボタンをクリックします。

  7. Form1 ノードを開きます。 その下に、Form1.Designer.cs または Form1.Designer.vb という名前のファイルがあります。 これは、フォームとその子コントロールのデザイン時の状態を表すコードが Windows フォーム デザイナーによって出力されるファイルです。 このファイルをコード エディターで開きます。

  8. Windows Form Designer generated code という名前の領域を開き、serializationDemoControl1 というラベルが付いたセクションを検索します。 このラベルの下には、コントロールのシリアル化された状態を表すコードがあります。 ステップ 5 で入力した文字列は、Strings プロパティへの割り当ての中にあります。 C# および Visual Basic の次のコード例では、文字列 "red"、"orange"、"yellow" を入力した場合と同様のコードが示されています。

    this.serializationDemoControl1.Strings = new string[] {
            "red",
            "orange",
            "yellow"};
    
    Me.serializationDemoControl1.Strings = New String() {"red", "orange", "yellow"}
    
  9. コード エディターで、Strings プロパティの DesignerSerializationVisibilityAttribute の値を Hidden に変更します。

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    
    <DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
    
  10. ソリューションをリビルドし、ステップ 3 と 4 を繰り返します。

注意

今度は、Windows フォーム デザイナーによって Strings プロパティへの割り当ては出力されません。

次のステップ

標準データ型のコレクションをシリアル化する方法がわかったら、カスタム コントロールをデザイン時環境により深く統合することを検討してください。 次のトピックでは、カスタム コントロールのデザイン時統合を強化する方法について説明します。

関連項目