とまと あんらいぷ…

エンジニアの活動記録とかつぶやきとか

GitHub
スポンサードリンク

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

スポンサードリンク

【.NET】プロパティに存在しないパスが入る【global::なんじゃこりゃ】

結論としてはMSのバグなのでしょう。
ただ回避策はみつかった。よかった。

またまた、わんくまの皆様に助けてもらいました。
本当に感謝・・・・
リンク:継承コントロールのプロパティに存在しないパスが入る

継承コントロールを作成し、そのコントロールに基底のコントロールを配置。
その継承コントロールを別のFormに貼っつける。

その後、
Visual Studioのデザイナをいじると、プロパティ値に
 global::~~
なんていうコードが入り込んでコンパイルエラーになる。

例としてはこんなの
this.buttonCancel.ImageKey = global::Namespace.Properties.Resources_nb_NO.Message;
ここ、関連してるんだろうね。
Windows Forms Designer.cs files corrupt after changing language
(デザイナ使ってプロパティを変更したら破損ファイルができちゃうよ!)

<回避策>

1.プロパティを指定すること
2.宣言時に初期化しておくこと
   private Label _Label = new Label() { Text = "最初の値だよ!" };
3.さらにCaption プロパティの getter を下記のように変更。

4.DefaultValue属性を指定する

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

(ほんとは、これ手抜き。綺麗に実装ずるならISupportInitialize インターフェースを作るのが良しとおもわれる)
理由・・・
建前上は
自前で Dispose する必要があると思います(Control は IDisposable なので)。

ゆえにインスタンス管理のことを考えると、TextBoxEX 内では new Label() せずに
Label プロパティの初期値は private Label _Label = null; の方が良い気がします


とりあえず、デザイナいじるとglobal::が入ってコンパイルエラーになるのだけは
直してくださいって思うよ。
でも知らない間に意図しない動きになるのもやだな。

あ。ISupportInitialize インターフェイスについてはこちら

今回の場合で言うと、void ISupportInitialize.EndInit() メソッドが呼ばれた時に、
Caption プロパティが保持している値と _Label.Text が保持している値を比べ、
違っていた場合は、_Label.Text に Caption の内容を反映させるようにするとか。

ですw
▼この記事を読んだ方は、こんな記事も読んでいます。▼

スポンサードリンク

テーマ:プログラミング - ジャンル:コンピュータ

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://dalmore.blog7.fc2.com/tb.php/44-313699a1
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。