プロが教えるわが家の防犯対策術!

C#でユーザーコントロールを作成しています。
※C#のカテゴリーがないので、こちらに質問させていただきます。

既存のコントロールを基底クラスとしているのですが、下記のコードで基底クラスのプロパティであるXXXを使用できないようにしました。

[Browsable(false)]
[Obsolete("使用不可", true)]
public new int XXX { get { return 0; } set { } }

この、XXXに対してアクセスするコードはコンパイルエラーとなり、プロパティウィンドウにも表示されず、一応は使用できないようには出来ました。
ところが、コントロールをフォームに貼り付けて、他の使用可能なプロパティ(YYYプロパティとします)を変更すると、Form.Designer.csのInitializeComponent()に、XXXに値を設定するコードが自動生成されます。当然、そのままコンパイルすればエラーとなります。
※XXXは、YYYの値に連動して値が変化する仕様です。YYYを追加したことでXXXが不要というか、あっては事故のもとになるので、使用不可にしました。

そこで、お教え願いたいのは、Form.Designer.csのInitializeComponent()に、プロパティの値を設定するコードが生成される仕組みです。若しくは、設定するコードが生成されないようにする方法です。

以上よろしくお願いします。

A 回答 (1件)

例えばTextBoxのMaxLengthだった時


取得は可能だが、設定は許可しない例です。

【コンポーネントの実装】
class Class1 : TextBox
{
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public new int MaxLength
{
get { return 0; }
protected set { }
}

private int _yyy;
public int YYY
{
get
{
return this._yyy;
}
set
{
this._yyy = value;
base.MaxLength = this._yyy;
}
}
}


【利用時】
class11.MaxLength = 1;

エラーメッセージ
set アクセサーにアクセスできないため、プロパティまたはインデクサー 'WindowsFormsApplication1.Class1.MaxLength' はこのコンテキストでは使用できません。




EditorBrowsable(EditorBrowsableState.Never)
外部ソリューションで参照された際に、コード入力中に表示されるインテリセンスの候補として出現しなくなります。
勘違いしてはならないのが、同一ソリューション内の他プロジェクトでは効きません。

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
コンポーネントを設置した際、Designerファイルで自動生成されるコードとして除外します。
これを設定することで、Designerファイル上にプロパティの設定コードは自動生成されません。



上記例だと、結果的に以下の動作になります。
 ・Designerファイルで制御文が入ってこない。
 ・インテリセンスに表示されてこない。
 ・直接入力されたとしても、値を設定することはできず、無意味?な値の取得のみ行える。
  (無意味かどうかは実装に応じて・・・)


Obsolete("使用不可", true)は、上記に加えてお好きにどうぞ、という感じです。
Obsolete()はメッセージが適切かどうか微妙では?
操作不能としたいという要望では、上記の方法論の方が適切かもしれません。
    • good
    • 0
この回答へのお礼

早速の回答、ありがとうございました。
試したところ、うまく動作しました。

お礼日時:2015/01/20 18:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!