マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。

目次

概要

子コントロールを持つFormやカスタム コントロールの子コントロールを生成する処理を、
コンストラクタに実装した場合、実行時の表示が「不正になる」現象に対する対処方法等を纏めている。

この問題は、

で発生する。

共通的な問題

処理の移動

デザイン時に使用できる値

デザイン時に使用できる値は、実行時に使用できる値と異なる。

Windows Forms

対策の概要

InitLayout?イベント・ハンドラ

対策としては、InitLayout?イベント・ハンドラをオーバ ライドして
カスタム コントロールの初期化処理を同梱するという方法が有用である。

Designプロパティ

また、Designプロパティを使用してデザイン時と実行時を判別できる。

詳細

原因

この結果が、*.Designer.cs(vb)に出力される
VisualStudio?デザイナの仕様であるため、
子コントロールの二重登録のような問題が起きてしまう。

対策

考察

Windows Formsでは、デザイン専用コードを実装する必要が無いため、
ASP.NET Web Formsのケースより簡単にデザイン時と実行時の表示を一致させることが出来るが、
製品レベルの作り込みで、通常、ユーザ・プログラムでここまでの実装は行わない方が無難であると考える。

ASP.NET Web Forms

対策の概要

処理の移動

コンストラクタに実装した処理を、ロード イベントに移動する。

デザイン サポート コードを実装

GetDesignTimeHtml?メソッドからVisual Studioデザイナに表示するHTMLを返すことで対応する。

詳細

原因

カスタムのRadioButtonList?コントロールのタグ内に、
子コントロール(ListItem?)のコレクションのタグが出力される。

<my_wcc:WebCustRadioButtonList ID="WebCustRadioButtonList1" runat="server" Width="340px">
  <asp:ListItem Value="選択項目1">選択項目1</asp:ListItem>
  <asp:ListItem Value="選択項目2">選択項目2</asp:ListItem>
  <asp:ListItem Value="選択項目3">選択項目3</asp:ListItem>
</my_wcc:WebCustRadioButtonList>

この実装の状態で、Visual Studioデザイナでコントロールのサイズを変更したところ、

Visual Studioデザイナ上での表示が下記のような、意図せぬ表示となる問題が発生する。

<my_wcc:WebCustRadioButtonList ID="WebCustRadioButtonList1" runat="server" Width="340px">
  <asp:ListItem Value="選択項目1">選択項目1</asp:ListItem>
  <asp:ListItem Value="選択項目2">選択項目2</asp:ListItem>
  <asp:ListItem Value="選択項目3">選択項目3</asp:ListItem>
  <asp:ListItem Value="選択項目1">選択項目1</asp:ListItem>
  <asp:ListItem Value="選択項目2">選択項目2</asp:ListItem>
  <asp:ListItem Value="選択項目3">選択項目3</asp:ListItem>
</my_wcc:WebCustRadioButtonList>

これは、Visual Studioデザイナ上でコンストラクタが2回実行され、
DataSource?ListItem?が2回追加されたためである。

対策

考察

一致させるには複雑な実装が必要になる。


Tags: :.NET開発, :UIサブシステム, :Windows Forms, :ASP.NET Web Forms


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS