13

次の属性を使用するパブリックプロパティを持つUserControlがあります。

[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

所有者フォームを削除し、Visual Studio 2010で新しいフォームを再作成して、このUserControlをフォームに追加してみました。Designerファイルに次のような行を追加し続けます。

this.vMyUserControl.MyProperty = ((MyNamespace.MyClass)(resources.GetObject("vMyUserControl.MyProperty")));

このプロパティはシリアル化によって作成されるように設計されていないため、これによりアプリケーションがクラッシュします。

4

4 に答える 4

13

プロパティを設計時に読み取り専用にすると、resx ファイルにシリアル化されなくなります。不思議なことに、MyType がたまたまコレクションである場合、デザイナーは読み取り専用を無視し、プロパティが resx に書き出されなくても設計時にプロパティを設定できるので、プロパティも参照できないようにすることをお勧めします。

[ReadOnly(true)]
[Browsable(false)]
public MyType MyProperty
{
    get { return _MyProperty; }
    set { _MyProperty = value; }
}
于 2013-10-21T05:13:25.220 に答える
5

使用する[DesignerSerializationVisibilityAttribute ( Visibility = Hidden )]

MSDN の記事

于 2011-10-16T09:10:24.897 に答える
2

[field: NonSerialized] 属性とともに、プロパティのアクセサー メソッドでプライベート フィールドを使用してみてください。

[field: NonSerialized]
private MyType _MyProperty;

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public MyType MyProperty
{
    get
    {
        return _MyProperty;
    }
    set
    {
        _MyProperty = value;
    }
}
于 2011-10-17T21:37:05.920 に答える
1

私は本当の解決策を見つけることができませんでしたが、代わりに回避策...

Form.resxファイルにアクセスして、パブリックプロパティに逆シリアル化するデータ/値キーのペアを見つける必要がありました。XMLペアの内容を手動で削除したところ、アプリケーションを実行できました。

これにより、アプリケーションをエラーなしでビルドして実行できるようになりました。私が試した他のすべて(UserControlのコンテナフォームの削除と繰り返しの再作成を含む)は機能しませんでした。

于 2011-10-17T20:34:48.350 に答える