DOBON.NET DOBON.NETプログラミング掲示板過去ログ

クラスオブジェクトを返すプロパティのデザイナ上での設定

環境/言語:[Win7 / VS2012 / C#]
分類:[.NET]

2012/09/14(Fri) 10:38:53 編集(投稿者)

:OS       = Windows 7 Home Premium(64bit)
:IDE      = Visual Studio Premium 2012
:Language = C#, VB, DelphiPrism(Oxygene for .NET)
:.NET     = .NET Framework 4 Client Profile

お世話になっております。

今回、情報を保持するだけのクラス(仮にTestInfoとします)を作り、
これのインスタンスを返すプロパティを持つコントロール
(仮にTestControlとします)を作りました。

このプロパティにはTypeConverter属性がついており
ExpandableObjectConverterが指定されています。また、getしかありません。
TestInfoのインスタンスはTestControlのコンストラクタ内で生成します。

[TypeConverter(typeof(ExpandableObjectConverter))]
class TestInfo
{
    private Color _color;
    private float _pos;
    
    public TestInfo()
    {
        _color = Color.White;
        _pos = 0.5;
    }
    
    [DefaultValue(typeof(Color), "White")]
    public Color Color
    {
        get { return _color; }
        set { _color = value; }
    }
    
    [DefaultValue(0.5f)]
    public float Position
    {
        get { return _pos; }
        set { _pos = value; }
    }
}

class TestControl : Button
{
    private TestInfo _info;
    
    public TestControl
      : base()
    {
        _info = new TestInfo();
    }
    
    public TestInfo TestInfo
    {
        get { return _info; }
    }
}


この状態でデザイナでTestControlを設置すると正常にTestInfoが展開されて
各メンバが見えるのですが、値を変更しても戻ってしまいます。

setを付加するとできるようになったことから、おそらくデザイナ自動生成では
TestInfoの新しいインスタンスを生成してTestControlのTestInfoプロパティに
代入するようなコードになってると思うのですが、コード上からはこのプロパティ自体に
代入されたくないのでどうしようか悩み中です。

setの中でNotSupportedExceptionを投げてやろうかと思いましたが
それではデザイナによるコードでも例外となるのでどうしようかなと…
(デザイナ生成コードでの設定かどうかを判定する方法があったようななかったような…)

以上よろしくお願いします
■No30931に返信(月夜見命さんの記事)
> 今回、情報を保持するだけのクラス(仮にTestInfoとします)を作り、
> これのインスタンスを返すプロパティを持つコントロール
> (仮にTestControlとします)を作りました。

その情報は ReadOnly では無く、編集可能にしたいという事でしょうか?


> コード上からはこのプロパティ自体に
> 代入されたくないのでどうしようか悩み中です。

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public TestInfo TestInfo
{
    get { return _info; }
}


>  _pos = 0.5;
「_pos = 0.5f;」にしないと。



>    public TestControl
>      : base()
「public TestControl()」あるいは「public TestControl() : base()」では?
■No30934に返信(魔界の仮面弁士さんの記事)
ありがとうございます。
手打ちしたので間違いだらけですね…
0.5fです。コンストラクタは実際にはちゃんと()ついてます。
すみません…

> [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
まさにやりたいことそのものでした!
デザイナによる自動生成コードがctrl.TestInfo.Color = ... みたいにならないかなーと
思っていたのでw


>その情報は ReadOnly では無く、編集可能にしたいという事でしょうか?
以下のようなイメージでした。

TestControl ctrl = new TestControl();
ctrl.TestInfo.Position = 0.3f; // これはOK
ctrl.TestInfo = new TestInfo(); // これはさせたくない。

そのためにTestControlのTestInfoプロパティはgetterのみとなっています。
が、それではデザイナ上からTestInfoを展開して各値を設定しても
デザイナによる自動生成コードに反映されず、戻ってしまいます。

これをなんとかしたいな、というお話でした。


ありがとうございます。これで次への希望がもてました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板