2009年6月6日土曜日

カスタムコントロールにascxファイルを作る理由がわからない。

asp.netのWebControlのカスタマイズで、ユーザコントロールっていうものとカスタムコントロールっていうのがあって(他にもあるかもしれないがとりあえずここではこの2つ)両方を開発することがあったのですが、ソースを見てみると、どちらもascxファイルを作ってあった。ただユーザコントロールは派生元がUserControlなのに対し、カスタムコントロールの派生元がLabelなどに置き換わっていました。
なので、ソリューションエクスプローラにascxが表示されるのだけれど、本来のユーザコントロールと違って、カスタムコントロールの場合はソリューションエクスプローラからドラッグ&ドロップでページに配置する使い方はできない。(UserControlから派生していないので)
で、もうちょっと調べてみたらascxのファイルは使っていないみたい。
なんでカスタムコントロールにascxを使ったのかと開発者に聞いてみたら、Webパーツだからとのこと。
使ってもいないファイルなのに(ascxファイルなので使っているaspxと同じように)本番環境に入れてしまうのだけれど、別に有ったからといって問題にならないからいいのかな?
カスタムコントロールのクラスライブラリ化する際にascxのファイルが問題になりそうだけど、今回のものはカスタムコントロールのクラスライブラリ化をしないみたいだし、こちらも問題ないか。

でも、やっぱりなんでascxファイルを作ったか、そのメリットも全然わからない。なんでだろう?

2009年6月5日金曜日

ユーザーコントロールについて

複数のドロップダウンリストがあるユーザコントロールで、親ドロップダウンリスト選択時に子ドロップダウンリストが更新されるユーザコントロールがありました。(ex:県と市町村のドロップダウンがあって、最初は県の一覧のドロップダウンリストのみ選択可能で、県を特定するその県下の市町村がドロップダウンリストにセットされて、市町村ドロップダウンリストが利用可能になるような動きで、県と市町村は親子関係のテーブルでDBに定義されている。)

で、これの親のドロップダウンリストに対するプロパティsetの反映をどうするかで問題になりました。


ASP.NET2.0の動きだと、以下の順番に処理が動きます。

1.aspxページのPage_Load()

2.ascxユーザコントロールのPage_Load()

3.ボタンイベント処理。


DBから読み込み県のドロップダウンリストに県名一覧をセットする処理を、2でにやらせるとなると、非ポストバックのページ読み込み時(aspxのPage_Load())で、県のプロパティセットをしたときには、県のドロップダウンリストがまだできていない状態なので、ドロップダウンのSelectedValueにセットするというのは何かおかしな感じがする。
でも、2.の時点で、県のプロパティの値を見てSelectedValueをセットした場合は、1の処理でプロパティセットをした場合はうまくいくけど、3のボタンイベント処理で、プロパティセットした値は、ドロップダウンリストに反映されなくなる。


で、本当は、1.の前に動くであろう、ユーザコントロール内のドロップダウンリストのInitイベントで、IsPostBackがfalseのときだけ県名のドロップダウンリストに値を詰め込んでおけば、プロパティセット時には、ドロップダウンリストが出来上がっているのでプロパティセット時にドロップダウンリストのSelectedValueに値を詰め込めばよかっただけのような気がします。

つまり、


1.県のドロップダウンリストのInitイベントにてIsPostBackがfalseのときのみ県名一覧をセットする。
2.市のドロップダウンリストのInitイベントでは、選択不可とする。
3.県のプロパティがセットされた場合は、県のドロップダウンリストのSelectedValueをセットし、市のドロップダウンリストは、選択された県の市名一覧をセットする。(県のプロパティに""がセットされた時は、市のドロップダウンリストを空にして選択不可とする。)
4.市のプロパティをセットされた時は、市のドロップダウンリストのSelectedValueをセットする。

でもこの方法はとらなくなりそう。

2009年6月2日火曜日

複数の一行入力テキストボックスと直後のボタン

asp.netの話。
ページに複数の一行入力のテキストボックスとボタンを2つ配置すると。。
テキストボックスの入力中にEnterキーを押すと、テキストボックスの後で一番近い場所に配置したボタンクリックイベント処理が動く。
テキストボックスが1つだけだったときは、page_load処理だけが動くのに、テキストボックスが2つ以上あるとpage_load()とbutton_click()が動いてしまう。
。。。何かの嫌がらせなのだろうか?