- PR -

ASP.NETのユーザーコントロール ascxの配置について

投稿者投稿内容
platini
大ベテラン
会議室デビュー日: 2002/12/03
投稿数: 193
投稿日時: 2003-12-08 23:23
ユーザー
通常 ascxはaspxの先頭にこのようにディレクティブしますよね。
<%@ Register TagPrefix="Acme" TagName="BookList" Src="pagelet6.ascx" %>

自作ユーザーコントロールではない例えばTextBoxなどは
コードビハインド(.csファイル)のPage_Loadで、
テーブルコントロールに対して
tCell = new TableCell();
TextBox tstBox = new TextBox();
tCell.Controls.Add ( txtBox )
とすることができます。
自作ユーザーコントロールの場合、
同じように書いても( 当然 WebUIControlクラスを継承しているのに)
エラーが出ますが、完全に動的に生成するページにおいて
(つまり自作コントロールの位置が最後まで確定できない)
どのように記述すれば、動的に位置変更などができるでしょうか。

(★ ページの処理内容によっては自作コントロールが
   場所だけでなく、個数も変化するため、どうしたものか・・・)

もし、よい知恵があれば教えてください。




きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2003-12-09 10:23
platiniさん、お早うございます。

方法はあるのかも知れませんが、必要であればカスタムコントロールを作成して使用する事をお奨めします。

aspxとかascxとかってのは、実行時にコンパイルされて、ASP.WebForm1_aspx とかASP.WebUserControl1_ascx とかのクラスになります。デバッグウィンドウで確認してみて下さい。

Page ディレクティブにある Inherits="WebForm1" などという記述を見ると、これらのクラスは、ビハインドコードで定義されたクラスを継承しているらしく、各種のロジックや子コントロールの宣言は WebForm1.aspx.vb(WebUserControl1.ascx.vb) 側、インスタンスの生成や、レイアウト・出力関係は WebForm1.aspx(aWebUserControl1.scx) 側で受け持っているようです(Windowsフォームと違って、ビハインド側にはデザイナで配置したコントロールの、インスタンス生成と配置に関するコードは自動生成されませんよね)。

ですので、
Controls.Add(new WebUserControl1());
とかやっても、コントロールとして機能しないんです。
CreateChildControls あたりのメソッドをオーバーライドして、子コントロールの生成とかをビハインド側のみで実装すれば動的生成も可能ですが、こうなるとユーザーコントロールである必要はありませんよね...。

platini
大ベテラン
会議室デビュー日: 2002/12/03
投稿数: 193
投稿日時: 2003-12-11 21:21
きくちゃんさん。ありがとうございます。参考になりました。
こういう配置上の苦労を知らず、先行して一生懸命元号入力コントロールを
作成してしまいました。結構苦労したのに(泣)

多少、参考になる情報があったので、
少し別の手も試してみます。また、うまくいった、うまくいかなかった
のいずれにしても報告します。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-12-11 21:44
引用:

platiniさんの書き込み (2003-12-11 21:21) より:

こういう配置上の苦労を知らず、先行して一生懸命元号入力コントロールを
作成してしまいました。結構苦労したのに(泣)


ん?GかEかそこらで、元号になるのではなかったかしらん?
#家の環境、再構築しなきゃ。。。
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2003-12-12 20:13
Jittaさん、こんばんは。

引用:

ん?GかEかそこらで、元号になるのではなかったかしらん?


マシンの、地域とか日付時刻の書式設定に左右されたような...。

↓こんな感じですかね。

コード:

Dim DateTimeFormatJp As Globalization.DateTimeFormatInfo = New Globalization.CultureInfo("ja-JP").DateTimeFormat
DateTimeFormatJp.Calendar = New Globalization.JapaneseCalendar

'日付→文字列
Dim Txt As String = DateTime.Now.ToString("D", DateTimeFormatJp)
'もしくは
Txt = DateTime.Now.ToString("ggy""年""M""月""d""日""", DateTimeFormatJp)

'こいつ↓は 西暦3年12月12日 になってしまった...。
Txt = DateTime.Now.ToString("ggy""年""M""月""d""日""")

'文字列→日付
Dim Dat As DateTime = DateTime.Parse(Txt, DateTimeFormatJp)


Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-12-12 22:43
引用:

きくちゃんさんの書き込み (2003-12-12 20:13) より:

↓こんな感じですかね。


わざわざありがとうございます。

 まぁ、その通りなんですが、、、う〜ん、まだ(もう?)頭が固いなぁ・・・
日本の元号を使うという時点で、「日本語環境」下にあると、決めていました。

そういえば、日本語環境下でわざわざ米式出力させている部分がありました(だって、連携するパッケージがそうじゃなきゃ理解してくれないんだもん)
platini
大ベテラン
会議室デビュー日: 2002/12/03
投稿数: 193
投稿日時: 2003-12-13 10:28
まず、結果からいくと一応できました。
要点
(1) 通常のユーザーコントロールを使用するサンプル例では, <@ Register
を使用している例が多いが、動的に位置を決定したり、個数を決定
  する必要がある場合 <@ Reference ディレクティブを使用する。
(2) コードビハインド側(.aspx.cs)では
  Page.LoadControlでそのコントロールを呼び出す。
(3)後は、Controls.Addなどで必要な位置に書き込む。

しかし!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
MSDNのヘルプではユーザーコントロールの配置には、一言も
Referenceディレクティブのことが書かれていない。
殆ど、偶然見つけた(Googleで探しまくったサンプルに偶然
載っていた)。一言書いておいてくれればよいのに。。。。

なお、今回わざわざユーザーコントロールを作成したのは、
年号での入力インターフェイスが必要だったこと
もありますが、更に、
年度単位の入力インターフェイスも必要であり、
こんなことをJavaScriptで実装すると、頭が腐りそうなので、
ユーザーコントロールに挑戦した次第です。

早く、元号使用の習慣なくなりませんかね。
別に天皇制はどうでもいいけど元号は勘弁して欲しい。
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2003-12-13 19:44
Jittaさん、こんばんは。

引用:

わざわざありがとうございます。


いや、ほとんど自分自身の確認のためだったりしますんで。
# 釈迦に説法みたいに見えたかな...。

引用:

日本の元号を使うという時点で、「日本語環境」下にあると、決めていました。


.net以前、ASPのVBスクリプトでは Format 関数の代わりに FormatDateTime 関数(書式指定文字列が使えない)ってのが用意されていたんですが、開発環境と本番環境で出力形式が違っていて(ともに日本語版)、もの凄〜く悩んだことがあります。で、結局その原因が、地域のプロパティで設定された日付の書式が違っていたせいだった、と...。

スキルアップ/キャリアアップ(JOB@IT)