コンストラクタで子コントロール追加すると二重追加される件
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicros...
-戻る
--[[VSデザイナの問題]]
--[[.NETコントロールのカスタマイズ方法]]
* 目次 [#a4f725bb]
#contents
*概要 [#mb024c27]
-(子コントロールを持つFormやカスタム コントロールの)~
子コントロールを生成する処理を、コンストラクタに実装した...
デザイン時と実行時の表示が乖離する現象に対する対処方法等...
-この問題は、
--[[Windows Forms>#ec5b8d0b]]
--[[ASP.NET Web Forms>#i022b8ec]]
>など、デザイナを持つUIサブシステムの開発環境で発生する。
-Formやカスタム コントロールのコンストラクタは、~
実行時だけでなく、デザイン時(Visual Studioデザイナ上で)...
--このため、子コントロールの二重登録のような問題が発生す...
--結果として、デザイン時と実行時の表示が異なることになる。
-この問題は、コンストラクタに実装していた処理を、ロード ...
解決できるが、この場合、デザイナに子コントロールが表示が...
*[[Windows Forms]] [#ec5b8d0b]
**原因 [#n8b590ec]
-VisualStudioデザイナにより生成されたコードは*.Designer.c...
--当該コントロールの子コントロール毎にメンバ変数が定義され
--InitializeComponentに子コントロールの設定処理が実装され...
-コンストラクタは実行時だけでなく、デザイン時にも実行され...
コンストラクタでは、上記のInitializeComponentを呼び出して...
-InitializeComponentは子コントロール毎に定義されたメンバ...
子コントロールをnewしてからプロパティ設定をしているため、~
子コントロールの二重登録のような問題は起きない。
-しかし、コンストラクタのコードから子コントロールを追加す...
--メンバに直接子コントロールをAddしたりする場合
--DataSourceを設定してDataBindしたりする場合
>この結果が、*.Designer.cs(vb)に出力される~
VisualStudioデザイナの仕様であるため、~
子コントロールの二重登録のような問題が起きてしまう。
**対策 [#o02e82cf]
***InitLayoutイベント・ハンドラ [#q2700a11]
このため、対策としては、InitLayoutイベント・ハンドラをオ...
Formやカスタム コントロールの初期化処理を同梱するという方...
-InitLayoutは、コントロール配置時にのみ発生するイベントの...
-このため、デザイン時・実行時に処理が実行されて二重登録が...
-ただし、コントロールのリサイズなどによってInitLayoutイベ...
この際、同様に結果が*.Designer.cs(vb)に出力され、~
二重登録のような問題が発生することがあるようなので、~
制御用のコードを別途、実装する必要がある。
-参考
--デザイナで配置できるコントロールを作ったらコンストラク...
http://uenomemo.sakura.ne.jp/pcmemo/54
--(vb.net)カスタムコントロール作成時に初期化処理を何でも...
コンストラクタに書いてはいけない : 3流プログラマのメモ書き~
http://jehupc.exblog.jp/7704408/
--全ては時の中に… : 【VB.NET】コントロール配置時に発生す...
http://blog.livedoor.jp/akf0/archives/51271278.html
***DesignModeプロパティ [#cea7b275]
また、DesignModeプロパティを使用してデザイン時と実行時を...
-参考
--[[VSデザイナの問題]]
**考察 [#d28ca154]
[[Windows Forms]]では、デザイン専用コードを実装する必要が...
[[ASP.NET Web Formsのケース>#i022b8ec]]より簡単にデザイン...
製品レベルの作り込みで、通常、ユーザ・プログラムでここま...
*[[ASP.NET Web Forms]] [#i022b8ec]
**対策の概要 [#j3eb857e]
***ロード イベントに処理を移動 [#n5d1492c]
-コンストラクタに実装した処理を、ロード イベントに移動す...
-この場合、この場合、デザイナに子コントロールが表示がされ...
必要に応じて、以下の[[デザイン サポート コードの実装>#fdc...
***デザイン サポート コードを実装 [#fdc5e48b]
GetDesignTimeHtmlメソッドからVisual Studioデザイナに表示...
**詳細 [#a43a8822]
***原因 [#u87784e7]
-WebサイトでなくWebアプリケーションであれば *.Designer.cs...
--メンバ変数の定義のみが生成され、
--子コントロールの設定処理は、*.aspxにマークアップ側に実...
-通常、*.aspxのマークアップを使用して子コントロールの設定...
-コンストラクタでAdd やDataBindで子コントロールを追加する...
WindowsFormsと同じように、子コントロールにマークアップに...
-例えば、~
下記のようなコンストラクタの実装によって、~
選択項目1~3を生成するカスタムRadioButtonListコントロール...
/// <summary>コンストラクタ</summary>
/// <summary>コンストラクタでプロジェクトなどでの標準ス...
public WebCustRadioButtonList() {
// 初期設定のプロパティ値を設定する。
// ※デザインタイム・プロパティのほうが優先される。
// WebCustRadioButtonListの初期化(データバインド)
string[] itemlist = { "選択項目1", "選択項目2", "選...
this.DataSource = itemlist;
this.DataBind();
// 横方向にオプションボタンを並べて表示する。
this.RepeatDirection = RepeatDirection.Horizontal;
}
>カスタムのRadioButtonListコントロールのタグ内に、~
子コントロール(ListItem)のコレクションのタグが出力され...
<my_wcc:WebCustRadioButtonList ID="WebCustRadioButtonLis...
<asp:ListItem Value="選択項目1">選択項目1</asp:ListI...
<asp:ListItem Value="選択項目2">選択項目2</asp:ListI...
<asp:ListItem Value="選択項目3">選択項目3</asp:ListI...
</my_wcc:WebCustRadioButtonList>
>この実装の状態で、Visual Studioデザイナでコントロールの...
~Visual Studioデザイナ上での表示が下記のような、意図せぬ...
<my_wcc:WebCustRadioButtonList ID="WebCustRadioButtonLis...
<asp:ListItem Value="選択項目1">選択項目1</asp:ListI...
<asp:ListItem Value="選択項目2">選択項目2</asp:ListI...
<asp:ListItem Value="選択項目3">選択項目3</asp:ListI...
<asp:ListItem Value="選択項目1">選択項目1</asp:ListI...
<asp:ListItem Value="選択項目2">選択項目2</asp:ListI...
<asp:ListItem Value="選択項目3">選択項目3</asp:ListI...
</my_wcc:WebCustRadioButtonList>
>これは、Visual Studioデザイナ上でコンストラクタが2回実行...
DataSourceにListItemが2回追加されたためである。
**対策 [#k957b28e]
-VisualStudioデザイン サポート コードは、[[ControlDesigne...
/// <summary>WebCustRadioButtonListのVisual Studioデザイ...
internal class WebCustRadioButtonListDesigner : ControlD...
/// <summary>メンバ変数にWebCustRadioButtonListを保持<...
protected WebCustRadioButtonList wcrbl;
/// <summary>初期化</summary>
public override void Initialize(IComponent component) {
if (component is WebCustRadioButtonList) {
base.Initialize(component);
this.wcrbl = (WebCustRadioButtonList)component;
}
}
/// <summary>Visual Studioデザイナに表示するHTMLを返す...
public override string GetDesignTimeHtml() {
try {
// 非常に単純なコードであるため、
// スタイル関係のプロパティ設定、子コントロールの...
string ret = ""
+ "<table>"
+ " <tr>"
+ " <td>"
+ " <input type=\"radio\" value=\"選択項目1\...
+ " <label >選択項目1</label>"
+ " </td>"
+ " <td>"
+ " <input type=\"radio\" value=\"選択項目2\...
+ " <label>選択項目2</label>"
+ " </td>"
+ " <td>"
+ " <input type=\"radio\" value=\"選択項目3\...
+ " <label >選択項目3</label>"
+ " </td>"
+ " </tr>"
+ "</table>";
return ret;
}
catch (Exception ex) {
// エラーの場合
return String
.Concat("<h3>Error</h3>Stack Trace:<br>", ex.Sta...
}
}
}
-最後に、上記のデザイナ クラスを使用するように、カスタム ...
/// <summary>System.Web.UI.RadioButtonListのカスタム・コ...
[Designer("Ctrl.WebCustRadioButtonListDesigner"),
ToolboxData("<{0}:WebCustRadioButtonList runat=server></...
public class WebCustRadioButtonList : RadioButtonList
**考察 [#c5e49b42]
-このControlDesignerクラスのGetDesignTimeHtmlメソッドのオ...
文字のフォント、サイズ、色などの、スタイル関係のプロパテ...
-これらをHTMLタグに反映させる場合は、~
Visual Studioデザイン サポート コードを実装する必要がある...
しかし、デザインタイム・プロパティ設定により可変となる
--「実際のWebアプリケーション上での外観」と
--「Visual Studioデザイナ上での外観」を
>一致させるには複雑な実装が必要になる。
-プロジェクト部品でのサポートは考えなくて良いと考える。~
また、製品レベルの作り込みであっても、~
これらを「完全に」一致させるようなコードを実装するのは、...
避けた方が良い(デザインを行なうのに必要となる範囲で一致...
----
Tags: [[:.NET開発]], [[:UIサブシステム]], [[:Windows Form...
終了行:
「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicros...
-戻る
--[[VSデザイナの問題]]
--[[.NETコントロールのカスタマイズ方法]]
* 目次 [#a4f725bb]
#contents
*概要 [#mb024c27]
-(子コントロールを持つFormやカスタム コントロールの)~
子コントロールを生成する処理を、コンストラクタに実装した...
デザイン時と実行時の表示が乖離する現象に対する対処方法等...
-この問題は、
--[[Windows Forms>#ec5b8d0b]]
--[[ASP.NET Web Forms>#i022b8ec]]
>など、デザイナを持つUIサブシステムの開発環境で発生する。
-Formやカスタム コントロールのコンストラクタは、~
実行時だけでなく、デザイン時(Visual Studioデザイナ上で)...
--このため、子コントロールの二重登録のような問題が発生す...
--結果として、デザイン時と実行時の表示が異なることになる。
-この問題は、コンストラクタに実装していた処理を、ロード ...
解決できるが、この場合、デザイナに子コントロールが表示が...
*[[Windows Forms]] [#ec5b8d0b]
**原因 [#n8b590ec]
-VisualStudioデザイナにより生成されたコードは*.Designer.c...
--当該コントロールの子コントロール毎にメンバ変数が定義され
--InitializeComponentに子コントロールの設定処理が実装され...
-コンストラクタは実行時だけでなく、デザイン時にも実行され...
コンストラクタでは、上記のInitializeComponentを呼び出して...
-InitializeComponentは子コントロール毎に定義されたメンバ...
子コントロールをnewしてからプロパティ設定をしているため、~
子コントロールの二重登録のような問題は起きない。
-しかし、コンストラクタのコードから子コントロールを追加す...
--メンバに直接子コントロールをAddしたりする場合
--DataSourceを設定してDataBindしたりする場合
>この結果が、*.Designer.cs(vb)に出力される~
VisualStudioデザイナの仕様であるため、~
子コントロールの二重登録のような問題が起きてしまう。
**対策 [#o02e82cf]
***InitLayoutイベント・ハンドラ [#q2700a11]
このため、対策としては、InitLayoutイベント・ハンドラをオ...
Formやカスタム コントロールの初期化処理を同梱するという方...
-InitLayoutは、コントロール配置時にのみ発生するイベントの...
-このため、デザイン時・実行時に処理が実行されて二重登録が...
-ただし、コントロールのリサイズなどによってInitLayoutイベ...
この際、同様に結果が*.Designer.cs(vb)に出力され、~
二重登録のような問題が発生することがあるようなので、~
制御用のコードを別途、実装する必要がある。
-参考
--デザイナで配置できるコントロールを作ったらコンストラク...
http://uenomemo.sakura.ne.jp/pcmemo/54
--(vb.net)カスタムコントロール作成時に初期化処理を何でも...
コンストラクタに書いてはいけない : 3流プログラマのメモ書き~
http://jehupc.exblog.jp/7704408/
--全ては時の中に… : 【VB.NET】コントロール配置時に発生す...
http://blog.livedoor.jp/akf0/archives/51271278.html
***DesignModeプロパティ [#cea7b275]
また、DesignModeプロパティを使用してデザイン時と実行時を...
-参考
--[[VSデザイナの問題]]
**考察 [#d28ca154]
[[Windows Forms]]では、デザイン専用コードを実装する必要が...
[[ASP.NET Web Formsのケース>#i022b8ec]]より簡単にデザイン...
製品レベルの作り込みで、通常、ユーザ・プログラムでここま...
*[[ASP.NET Web Forms]] [#i022b8ec]
**対策の概要 [#j3eb857e]
***ロード イベントに処理を移動 [#n5d1492c]
-コンストラクタに実装した処理を、ロード イベントに移動す...
-この場合、この場合、デザイナに子コントロールが表示がされ...
必要に応じて、以下の[[デザイン サポート コードの実装>#fdc...
***デザイン サポート コードを実装 [#fdc5e48b]
GetDesignTimeHtmlメソッドからVisual Studioデザイナに表示...
**詳細 [#a43a8822]
***原因 [#u87784e7]
-WebサイトでなくWebアプリケーションであれば *.Designer.cs...
--メンバ変数の定義のみが生成され、
--子コントロールの設定処理は、*.aspxにマークアップ側に実...
-通常、*.aspxのマークアップを使用して子コントロールの設定...
-コンストラクタでAdd やDataBindで子コントロールを追加する...
WindowsFormsと同じように、子コントロールにマークアップに...
-例えば、~
下記のようなコンストラクタの実装によって、~
選択項目1~3を生成するカスタムRadioButtonListコントロール...
/// <summary>コンストラクタ</summary>
/// <summary>コンストラクタでプロジェクトなどでの標準ス...
public WebCustRadioButtonList() {
// 初期設定のプロパティ値を設定する。
// ※デザインタイム・プロパティのほうが優先される。
// WebCustRadioButtonListの初期化(データバインド)
string[] itemlist = { "選択項目1", "選択項目2", "選...
this.DataSource = itemlist;
this.DataBind();
// 横方向にオプションボタンを並べて表示する。
this.RepeatDirection = RepeatDirection.Horizontal;
}
>カスタムのRadioButtonListコントロールのタグ内に、~
子コントロール(ListItem)のコレクションのタグが出力され...
<my_wcc:WebCustRadioButtonList ID="WebCustRadioButtonLis...
<asp:ListItem Value="選択項目1">選択項目1</asp:ListI...
<asp:ListItem Value="選択項目2">選択項目2</asp:ListI...
<asp:ListItem Value="選択項目3">選択項目3</asp:ListI...
</my_wcc:WebCustRadioButtonList>
>この実装の状態で、Visual Studioデザイナでコントロールの...
~Visual Studioデザイナ上での表示が下記のような、意図せぬ...
<my_wcc:WebCustRadioButtonList ID="WebCustRadioButtonLis...
<asp:ListItem Value="選択項目1">選択項目1</asp:ListI...
<asp:ListItem Value="選択項目2">選択項目2</asp:ListI...
<asp:ListItem Value="選択項目3">選択項目3</asp:ListI...
<asp:ListItem Value="選択項目1">選択項目1</asp:ListI...
<asp:ListItem Value="選択項目2">選択項目2</asp:ListI...
<asp:ListItem Value="選択項目3">選択項目3</asp:ListI...
</my_wcc:WebCustRadioButtonList>
>これは、Visual Studioデザイナ上でコンストラクタが2回実行...
DataSourceにListItemが2回追加されたためである。
**対策 [#k957b28e]
-VisualStudioデザイン サポート コードは、[[ControlDesigne...
/// <summary>WebCustRadioButtonListのVisual Studioデザイ...
internal class WebCustRadioButtonListDesigner : ControlD...
/// <summary>メンバ変数にWebCustRadioButtonListを保持<...
protected WebCustRadioButtonList wcrbl;
/// <summary>初期化</summary>
public override void Initialize(IComponent component) {
if (component is WebCustRadioButtonList) {
base.Initialize(component);
this.wcrbl = (WebCustRadioButtonList)component;
}
}
/// <summary>Visual Studioデザイナに表示するHTMLを返す...
public override string GetDesignTimeHtml() {
try {
// 非常に単純なコードであるため、
// スタイル関係のプロパティ設定、子コントロールの...
string ret = ""
+ "<table>"
+ " <tr>"
+ " <td>"
+ " <input type=\"radio\" value=\"選択項目1\...
+ " <label >選択項目1</label>"
+ " </td>"
+ " <td>"
+ " <input type=\"radio\" value=\"選択項目2\...
+ " <label>選択項目2</label>"
+ " </td>"
+ " <td>"
+ " <input type=\"radio\" value=\"選択項目3\...
+ " <label >選択項目3</label>"
+ " </td>"
+ " </tr>"
+ "</table>";
return ret;
}
catch (Exception ex) {
// エラーの場合
return String
.Concat("<h3>Error</h3>Stack Trace:<br>", ex.Sta...
}
}
}
-最後に、上記のデザイナ クラスを使用するように、カスタム ...
/// <summary>System.Web.UI.RadioButtonListのカスタム・コ...
[Designer("Ctrl.WebCustRadioButtonListDesigner"),
ToolboxData("<{0}:WebCustRadioButtonList runat=server></...
public class WebCustRadioButtonList : RadioButtonList
**考察 [#c5e49b42]
-このControlDesignerクラスのGetDesignTimeHtmlメソッドのオ...
文字のフォント、サイズ、色などの、スタイル関係のプロパテ...
-これらをHTMLタグに反映させる場合は、~
Visual Studioデザイン サポート コードを実装する必要がある...
しかし、デザインタイム・プロパティ設定により可変となる
--「実際のWebアプリケーション上での外観」と
--「Visual Studioデザイナ上での外観」を
>一致させるには複雑な実装が必要になる。
-プロジェクト部品でのサポートは考えなくて良いと考える。~
また、製品レベルの作り込みであっても、~
これらを「完全に」一致させるようなコードを実装するのは、...
避けた方が良い(デザインを行なうのに必要となる範囲で一致...
----
Tags: [[:.NET開発]], [[:UIサブシステム]], [[:Windows Form...
ページ名: