チュートリアル : DesignerSerializationVisibilityAttribute を使用した、標準データ型のコレクションのシリアル化

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

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

注意

実際に画面に表示されるダイアログ ボックスとメニュー コマンドは、アクティブな設定またはエディションによっては、ヘルプの説明と異なる場合があります。 設定を変更するには、[ツール] メニューの [設定のインポートとエクスポート] をクリックします。 詳細については、「設定の操作」を参照してください。

必須コンポーネント

このチュートリアルを完了するための要件は次のとおりです。

  • Visual Studio がインストールされているコンピューターで、Windows フォーム アプリケーション プロジェクトを作成および実行するための十分なアクセス許可が付与されていること。

シリアル化可能なコレクションを持つコントロールの作成

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

シリアル化可能なコレクションを持つコントロールを作成するには

  1. SerializationDemoControlLib という名前の Windows コントロール ライブラリ プロジェクトを作成します。 詳細については、「Windows コントロール ライブラリ テンプレート」を参照してください。

  2. UserControl1 の名前を SerializationDemoControl に変更します。 詳細については、「方法 : 識別子の名前を変更します。」を参照してください。

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

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

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

    プロパティ

    変更後の値

    Multiline

    true

    Dock

    Fill

    ScrollBars

    Vertical

    ReadOnly

    true

  6. コード エディターを使用して、stringsValue という名前の文字列配列フィールドを SerializationDemoControl で宣言します。

    ' This field backs the Strings property.
     Private stringsValue(1) As String
    
    // This field backs the Strings property.
    private String[] stringsValue = new String[1];
    
            // This field backs the Strings property.
        private:
            array<String^>^ stringsValue;
    
    
    
  7. SerializationDemoControl の Strings プロパティを定義します。

注意

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.
 <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
// 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.
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();
        }
    }
  1. F5 キーを押してプロジェクトをビルドし、ユーザー コントロール テスト コンテナーでコントロールを実行します。

  2. ユーザー コントロール テスト コンテナーPropertyGrid で、Strings プロパティを探します。 Strings プロパティをクリックし、省略記号ボタン (VisualStudioEllipsesButton スクリーンショット) をクリックして、文字列コレクション エディターを開きます。

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

注意

   入力した文字列が SerializationDemoControl の TextBox に表示されます。

コレクション プロパティのシリアル化

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

コレクションをシリアル化するには

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

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

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

  4. [プロパティ] ウィンドウで、Strings プロパティを見つけます。 Strings プロパティをクリックし、省略記号ボタン (VisualStudioEllipsesButton スクリーンショット) をクリックして、文字列コレクション エディターを開きます。

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

注意

入力した文字列が SerializationDemoControl の TextBox に表示されます。

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

  2. [Form1] ノードを開きます。 このノードの下に、Form1.Designer.cs または Form1.Designer.vb というファイルが表示されます。 Windows フォーム デザイナーは、このファイルにフォームと子コントロールのデザイン時の状態を表すコードを出力します。 コード エディターでこのファイルを開きます。

  3. Windows Form Designer generated code という領域を開き、serializationDemoControl1 というラベルが付けられたセクションを見つけます。 このラベルの下が、コントロールのシリアル化状態を表すコードです。 手順 5. で入力した文字列が、Strings プロパティへの代入として表示されます。 たとえば、文字列として "red"、"orange"、および "yellow" を入力した場合には、次のようなコードが表示されます。

  4. [Visual Basic]

    Me.serializationDemoControl1.Strings = New String() {"red", "orange", "yellow"}
    
  5. [C#]

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

  7. [Visual Basic]

    <DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
    
  8. [C#]

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    
  9. ソリューションを再度ビルドし、手順 4. から 8. を繰り返します。

注意

この場合、Windows フォーム デザイナーは、Strings プロパティへの代入を出力しません。

次の手順

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

参照

処理手順

方法 : 標準の型のコレクションを DesignerSerializationVisibilityAttribute でシリアル化する

チュートリアル : ツールボックスへのカスタム コンポーネントの自動設定

参照

DesignerSerializationVisibilityAttribute

概念

デザイナーのシリアル化の概要