C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 106 を表示中)
■63389 / )  Re[5]: 継承コントロールのプロパティに存在しないパスが入る
□投稿者/ 魔界の仮面弁士 (30回)-(2012/08/21(Tue) 22:11:43)
No63372, No63386, No63387 (Unripe01 さん) に返信
> ※魔界の仮面弁士 からのご指摘があり、コード修正しています。
敬称略。

> public TextBoxEX()
> {
>     InitializeComponent();
> }
手元の環境で継承コントロールを作ってみたのですが、上記のコード部分が
自動生成されることはありませんでした。
(partial class の片割れとなる TextBoxEX.designer.cs も生成されない)

そちらでは、どのようにして生成されたのでしょうか?


なお、当方での作り方はこんな感じです。

(1) 新規プロジェクトを作成(WindowsApplication1)

(2) プロジェクトに、新規クラス TextBoxEX.cs を追加する。
 この時点のコードは下記の状態。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WindowsFormsApplication1
{
    class TextBoxEX
    {
    }
}

(3) 上記コードをバッサリ削除して、No63372 の「継承コントロールクラス」の
 コードに入れ替える。

(4) このままだとエラーになるので、先頭に以下の using を追加。

using System.Windows.Forms;
using System.ComponentModel;

(5) InitializeComponent が無いと言われるので、コンストラクタ自体を
 まるごとコメントアウトする。

  // public TextBoxEX()
  // {
  //     InitializeComponent();
  // }

(6) ここで一度ソースコードウィンドウをすべて閉じてから
 WindowsApplication1 をビルド。その後、ソリューションエクスプローラから
 TextBoxEX.cs をダブルクリックすると、TextBoxEX.cs のデザイン画面が開くので、
 [ここをクリックするとコードビューに切り替わります]をクリック。

(7) この段階では、ソースコードに変化なし。
 InitializeComponent も コンストラクタも生成されていない。

(8) TextBoxEX のデザイン画面に、ツールボックスから Label をドロップしてきて、
 label1 が貼りついた状態にする。この状態で保存すると TextBoxEX.resx が出現。

(9) あらためて TextBoxEX.cs を見ると、private void InitializeComponent() が
 生成されていた。しかし、コンストラクタは存在しないまま。

(10) TextBoxEX に張り付いた label1 を削除してみるが、やはり
 InitializeComponent を呼び出すコンストラクタが自動生成されることは無かった。



> this.txtKensuEnd.Caption = global::sampleApp.app.resource.sample1.sampleValue1;
上記の手順(1)~(7)を踏んで作った TextBoxEX.cs (TextBoxEX.resx は無し)を
Form1 に貼り付けてみたところ、一応、
  this.textBoxEX1.Caption = global::WindowsFormsApplication1.Properties.Resources.sampleValue2;
という状態にはなりました。でも、似ているけれど全然違いますね…。
(Unripe01 さんのコードでは小文字単数形の「resource」になったと書かれているが、
 こちらは、大文字始まり複数形の「Resources」になっている)


う~ん。何が違うのでしょうね。


> となってしまう件については、まったく解決のめどが立っていません。
> リビルドを繰り返したり、TextBoxEXを再作成するなどを繰り返ししたところ、発生しなくなったので
> 「何かが壊れていた」と結論づけて終わりたいと思います。

とりあえず、上記手順(3) の段階のコードで、
    // private Label _Label = new Label();
    private Label _Label = new Label() { Text = "でふぉるとばりゅ" };
に変更し、さらにCaption プロパティの getter を下記のように変更してみました。

  get
  {
      //return this.Label.Text;
      if (this.Label != null && !this.Label.IsDisposed
          /* && this.Label.IsHandleCreated */)
      {
          return this.Label.Text;
      }
      else
      {
          return null;
      }
  }


この場合は、「.Caption = ~.sampleValue1;」形式のデザイナコードにはならず、
以下のような結果になりました。

・初期値(でふぉるとばりゅ)の場合は、デザイナコードに Caption 設定の行が作られない。

・Form1デザイナで Caption プロパティを変更した場合には、
 「this.textBoxEX1.Caption = "あたらしい値だよ!";」
 形式のデザイナコードが生成された。


まぁ、実際にはこんなコードではマズイでしょうけれども。




> リセットされた場合のリセット値で、
> コントロールを張り付けた時のデフォルト値ではないということが分かっておりませんでした。
デフォルト値であっていますよ。

注意しなければならないのは、DefaultValueAttribute というものは、
『既定値』をデザイナに伝えるためのものであって、
『初期値』を設定するものではない、という点でしょうか。

最初のコードは、「初期値 = ""」、「既定値 = "でふぉるとばりゅ"」ですね。


> シリアライズ、デシリアライズについては考慮不要のため、問題ないです。
Caption プロパティにデザイナがアクセスする際に、Label プロパティが
適切に生成されているのか、生成タイミングが気になるところ。

返信 編集キー/


管理者用

- Child Tree -