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

属性(Attribute)記載部分をアウトラインの中に含めるようにしたい

環境/言語:[OS : Windows Vista Ultimate / 言語 : C# / .NET Framework : 2.0]
分類:[.NET]

【解決したい問題】

「Windows コントロールライブラリ」で「TextBox」をベースに自作したものの属性(Attribute)記載部分をアウトラインの中に含めるようにしたい。

<具体的な説明>
開発言語 VS2005 C# (sp1適用)

1.TextBoxを継承して独自のコントロール(以降「CustBox」と称す)を作成しました。
2.作成した「CustBox」をツールボックスから選択し、Form1に配置しました。
3.ソリューションエクスプローラの「Form1.Designer.cs」を開いて「CustBox」を右クリックして「定義へ移動」メニューを選択する。

上記3を行うと「CustomTextBox[メタデータから]」と言う名前のソースが開かれるのですが、
属性表示部分をアウトラインの中に含まれるようにしたい。
class部分だけではなく、各プロパティに記述した属性も隠れていないので「定義へ移動」したときの
見栄えをシンプルにしたいと思うのですが、何をするとアウトラインで展開しない限り
隠れるようになるのでしょうか??

↓メタデータからで表示されたイメージ(アウトライン展開中)
- namespace CustomTextBox
 {
  [Description("入力補助コントロールです。")]
  [ToolboxBitmap(typeof(CustBox), "CustomTextBox.bmp")]
-  public class CustBox: TextBox
  {
    :

↓メタデータからで表示されたイメージ(アウトライン折りたたみ中)
- namespace CustomTextBox
 {
  [Description("入力補助コントロールです。")]
  [ToolboxBitmap(typeof(CustBox), "CustomTextBox.bmp")]
+  public class CustBox: TextBox...
 }


ちなみに「TextBox」を選んで「定義へ移動」した場合は、

- namespace System.Windows.Forms
+  ...public class TextBox : TextBoxBase

このように右端が「+」表示となり、折りたたむことができて、さらに「+」を押すと展開され、コメントと属性が表示されるようです。

これと同じようにしたいのですが、どんな書き方を行うと実現できるのか分かりません。
どなたかご存知の方がいらっしゃるようでしたら、ご教授願えませんでしょうか。

【解決するために何をしたか】

Googleで「c# 属性 アウトライン」で検索は行いました。
属性についての説明は多数見つけられるのですが、
アウトラインで折りたたみ時の隠し方(←不適切な言葉かも知れませんが)に関する
記載については、なかなか見つけられませんでした。。。
また、一通り過去ログも検索はしましたが、同じような投稿は見つけられませんでしたので、投稿させていただきました。
> 「Windows コントロールライブラリ」で「TextBox」をベースに自作したものの属性(Attribute)記載部分をアウトラインの中に含めるようにしたい。

その後も実は諦めず試してました。 A(^-^;
結局、結論はでてないのですが・・・。
とりあえず、中間報告かな。

#region 〜 #endregionを使えば折りたためるのね。
ということで、よしっ!即チャレンジよ!
以下のように記述して試しました。

- namespace CustomTextBox
 {
-  #region ...public class CustBox: TextBox
  [Description("入力補助コントロールです。")]
  [ToolboxBitmap(typeof(CustBox), "CustomTextBox.bmp")]
  #endregion
-  public class CustBox: TextBox
  {
    :

このように記述すると以下のようになります。

- namespace CustomTextBox
 {
+  ...public class CustBox: TextBox
-  public class CustBox: TextBox
  {
    :

おぉ!近いかな?
早速、TextBoxの「定義へ移動」の見え方と比較!(以下TextBoxの場合の見え方)

- namespace System.Windows.Forms
 {
+  ...public class TextBox : TextBoxBase
  {

あらら・・・。おしいぃ! A(^-^;
これを「+」部分を押して展開すると・・・

- namespace System.Windows.Forms
 {
  // 概要:
  // Windows テキスト ボックス コントロールを表します。
  [Designer("System.Windows.Forms.Design.TextBoxDesigner, System.Design, ・・・(長いので省略)
  [ComVisible(true)]
  [ClassInterface(1)]
-  public class TextBox : TextBoxBase
  {

うぅぅぅん、なんてスマートなんだろう o(T_T)o
同じように表示したいのだけど、上手くいかないなぁ。。。

駄目もとで、ソリューションをビルド!
フォームに配置し「定義へ移動」で確認!

・・・。

- namespace CustomTextBox
 {
  [Description("入力補助コントロールです。")]
  [ToolboxBitmap(typeof(CustBox), "CustomTextBox.bmp")]
-  public class CustBox: TextBox
  {
    :

|||(-_-;)||| → why?
本当は、こんな感じに表示されたいのに。。。

- namespace CustomTextBox
 {
+  ...public class CustBox: TextBox
  {
    :


と言う感じで、一向に先に進みません A(^-^;;
同じようにスマートに表示を見せたい願望はわたしだけなのかな?
標準コントロールで実現できているので、きっとできると信じてお試しちゅうでした。
何か、ご存知のお方がいらっしゃれば、是非情報のご提供をお願いします。 m(_ _;)m
> 標準コントロールで実現できているので、きっとできると信じてお試しちゅうでした。

標準コントロールで実現と言いますが、標準コントロールはオブジェクトブラウザで見るしかないので、ソースでの表示はできない筈ですが?

> 何か、ご存知のお方がいらっしゃれば、是非情報のご提供をお願いします。 m(_ _;)m
>

これは C# のコードエディタの仕様だと思います。ちなみに VB.NET は属性も含めて定義にきちんと折りたたまれます。
本筋の質問への回答でなくて申し訳ありません。

■No25062に返信(ひらぽんさんの記事)
> 標準コントロールで実現と言いますが、標準コントロールはオブジェクトブラウザで見るしかないので、ソースでの表示はできない筈ですが?

C# のコードエディタでは、手元のソースコードがないライブラリに含まれるコントロール(クラス)であっても、「メタデータ」としてメソッドやプロパティ、それらに付加されている属性を閲覧できる、簡単なソースコードのようなものが表示されます。

なお、VB では同一の操作をした場合、オブジェクトブラウザが表示されます。
手元で実験したところ、XML ドキュメント ファイルがある場合に、アウトラインの動作が変わるようです。

1.プロジェクトのプロパティのビルドタブで、「XML ドキュメント ファイル」にチェックを入れて、ファイル名はデフォルトのままにします。
2.公開するクラスの全ての公開メンバに XML コメントを書きます。( /// と打つとテンプレートが出てくるので、そこに概要などの説明を書く)
3.ビルドします。
4.できあがったアセンブリを別ソリューションから参照した場合、標準のコントロールと呼ばれるような挙動と同じような挙動をします。


注意点としては XML ファイルを DLL とペアにしなければならないことです。
こんばんは、ayami0429です。
ひらぽんさま、返信ありがとうございます。


> 標準コントロールで実現と言いますが、標準コントロールはオブジェクトブラウザで見るしかないので、ソースでの表示はできない筈ですが?
Azuleanさまが次に書いてくれてましたが、VBからだとオブジェクトブラウザが開かれるようですね。A(^-^;


> これは C# のコードエディタの仕様だと思います。ちなみに VB.NET は属性も含めて定義にきちんと折りたたまれます。
ユーザコントロールを作成している段階のコードエディタでは、
c#もVB.NETと同じく?折りたためるようです。


<c#で記述>

 展開イメージ
- namespace CustomTextBox
 {
-  #region たたみ実験
  [Description("入力補助コントロールです。")]
  [ToolboxBitmap(typeof(CustBox), "CustomTextBox.bmp")]
  #endregion
-  public class CustBox: TextBox
  {
    :

 折りたたみイメージ
- namespace CustomTextBox
 {
+  たたみ実験
-  public class CustBox: TextBox
  {
    :

何かと奥が深いですね (^^;

■25070 Azuleanさまの方法を確認してみようと思います。
注意はありそうですが、まずは実験してわたしの目で確認してみよう!

ありがとうございました。m(_ _)m
> C# のコードエディタでは、手元のソースコードがないライブラリに含まれるコントロール(クラス)であっても、「メタデータ」としてメソッドやプロパティ、それらに付加されている属性を閲覧できる、簡単なソースコードのようなものが表示されます。
>
> なお、VB では同一の操作をした場合、オブジェクトブラウザが表示されます。

ありがとうございます。これは初めて知りました。
実際試してみると、これはなかなか面白い機能ですね。(・∀・)
> Azuleanさまへ
貴重なお時間を裂いて試していただきましてありがとうございます。 m(_ _)m
わたしも早速試してみました。


> 1.プロジェクトのプロパティのビルドタブで、「XML ドキュメント ファイル」にチェックを入れて、ファイル名はデフォルトのままにします。
⇒ふむふむ。
 チェックボックス、スクロールして下方を見ると、出力と記載がある部分に確かに存在していました。
 ファイル名はデフォルト値(チェックを付けたときに自動でつく初期値)のままですね。
 「よし、チェック」
 今回の初期値は、「CustomTextBox」で作成しているので、「bin\Release\CustomTextBox.XML」でした。


> 2.公開するクラスの全ての公開メンバに XML コメントを書きます。( /// と打つとテンプレートが出てくるので、そこに概要などの説明を書く)
⇒「///」入力ですね、了解しました。
 public CustBox()の直上で入力!

  ///
  public CustBox()

   ↓

  /// <summary>
  ///
  /// </summary>
  public CustBox()

  うわっ出ました!
  自動的にコメントが差し込まれましたです。\(^-^)/
  以下のようにクラスの部分にもコメントを入れてみました。

  namespace CustomTextBox
  {
    /// <summary>
    /// class CustBox : TextBox</summary>
    [Description("入力補助コントロールです。")]
    [ToolboxBitmap(typeof(CustBox), "CustomTextBox.bmp")]
    public partial class CustBox : TextBox
    {
      /// <summary>
      /// CustBoxクラスの新しいインスタンスを初期化します。</summary>
      public CustBox()
      {
        InitializeComponent();
      }
    }
  }


> 3.ビルドします。
⇒はい、ビルドします。


> 4.できあがったアセンブリを別ソリューションから参照した場合、標準のコントロールと呼ばれるような挙動と同じような挙動をします。
⇒別のソリューション(今回は「test」)をc#アプリケーションとして作成し、Form1のデザイナを表示した状態にし、
 ツールボックスを右クリック→「アイテムの選択」を選んで「参照」ボタンからビルドした「CustomTextBox.dll」を選択。
 うん。準備完了です。

 早速、「Form1.Designer.cs」をコードエディタ上に開いて、「CustBox」と記載された文字上で「右クリック」し「定義へ移動」を選択!
 きゃ〜〜〜!デキマシタ!デキマシタよ!
 期待した通りとなりました!
 Azuleanさま、ありがとうございます!\(^-^)/


<これが期待していた折りたたみの見え方>
---------------------------------------------------------------------
- namespace CustomTextBox
 {
+   ...public class CustBox : TextBox
   {
+     ...public CustBox();

+     ...protected override void Dispose(bool disposing);
   }
 }
---------------------------------------------------------------------


<アウトラインの「+」を選択し展開された見え方>
---------------------------------------------------------------------
- namespace CustomTextBox
 {
-   // 概要:
   // class CustBox : TextBox
   [ToolboxBitmap(typeof(CustBox), "CustomTextBox.bmp")]
   [Description("入力補助コントロールです。")]
-   public class CustBox : TextBox
   {
-     // 概要:
     // CustBoxクラスの新しいインスタンスを初期化します。
     public CustBox();

-     // 概要:
     // 使用中のリソースをすべてクリーンアップします。
     //
     // パラメータ:
     // disposing:
     // マネージ リソースが破棄される場合 true、破棄されない場合は false です。
     protected override void Dispose(bool disposing);
   }
 }
---------------------------------------------------------------------


> 注意点としては XML ファイルを DLL とペアにしなければならないことです。
⇒ここ、とても気になります。 o(^-^;)o
 一度「test」ソリューションを閉じて「CustomTextBox.XML」を削除っと。
 よし「text」を再度開き、上記同様に「定義へ移動」を選択。

 ・・・。
 なるほど、納得しました。確かに展開されたイメージでの表示ですね。 A(^-^;
 と言うことは、dllを配置した場所と同じ場所に必ず「XML」が必要となるのかぁ〜。
 わたし的にはXMLが無くても同じ動きで良いのにね。って思いました。


長文になってしまいましたが、解決チェックをマーキング。
ご教授、本当にありがとうございました。 m(_ _)m
解決済み!

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