
いつもお世話になっております。
VS2005 FrameWork2.0にて
ASPポストバックのDatasourceの挙動について質問させて下さい。
使用コントロールはDatasourceプロパティを持っていればなんでもいいのですが、例えばデザイナで、
DropDownList.DatasourceIdに SqlDatasourceを指定し、
SqlDatasourceのSelectQueryに" Select * from Table1 "
なんて指定しておけば、いくらポストバックが発生しても
常にDropDownList.DatasourceがNullでない状態で
、なおかつSQLサーバーをプロファイルしていても
Select文の発行は初回の1回だけでした。
でも、
手動で
DropDownList.DataSource = GetDataSource1()
DropDownList.DataBind()
※GetDataSource1()は、データベースをOpenしてDataTableを返すメソッド
みたいにコード上でバインドしておくと、
次のポストバック時にDataSourceがNULLになっています。
毎ポストバック時にDataBind()を書くと、
毎回Open~Select処理が走ってしまい嬉しくありません。
手動バインドさせる場合のスタンダードな書き方ってあるのでしょうか?
こういったことがナンセンスで、
本来は
[DataObjectMethod(DataObjectMethodType.Select)]属性をつけたメソッドを用意してObjectDatasourceのSelectメソッド等でやるのがスタンダードなんだよ
といったご指摘もあれば全てお聞きしたいと思っております。
よろしくお願い致します。
No.1ベストアンサー
- 回答日時:
いくつかの条件がからんでいますが、一般的にということで。
。ポストバック時、BindControlのDataSourceプロパティはnullになっていますが、通常、ViewStateをonにしていれば、BindControl自身の値(RepeaterであればItemTemplate生成のテキストボックスなど)がViewStateにドカンと保持されて、自動的に再表示されますので、再度DataBindする必要はないと思います。
自分は、ASP.NET 2.0 Web Formであれば、
初回時:データソースから読込み、DataBind実行
ポストバック時:追加・削除・更新の場合のみ、DB操作を行ってから読込み、DataBind実行
といった感じで統一しています。
ただ、毎回DBから読み込む方式と、ViewStateに値を埋めておいて送信する方法の比較ですが、DBドライバ側のキャッシュ機能などを考えれば、デカいViewStateより再SELECTのほうが早いような感じがします。
また、新しいASP.NET MVCではもはやViewStateもPostBackも使っていません(やっぱり)。
SQL DataSourceもObject DataSourceもキレイサッパリなくなって、「LINQかEntity Frameworkを使え」ということのようです。
ご回答ありがとうございます!
ASP.NET MVC については全く知りませんでした。
http://codezine.jp/article/detail/2748
の記事でも読んで勉強しておきます!
>ViewStateにドカンと保持されて、自動的に再表示されますので、再度DataBindする必要はないと思います。
ということですが、確かにコントロールそのももの値はViewStateに入ってるんですが、ドロップダウンリストのSelectedIndexに対応している列データが複数ほしい場合に困っていました。
例えば・・・
DataTextField = "Col1"
DataValueField = "Col2"
と設定していても、バインドデータの"Col3"まで保持できないといった場合です。
今回は、あまりバインドデータ量も多くないので
最初のPostBack時にDataTableをViewState("DataTable")に格納、
ドロップダウン["ddl_1"]のIndexChangedイベントにて、
ViewState("DataTable").Row(ddl_1.SelectedIndex).Item("Col3")
のようにアクセスするようにしました。
毎回Select投げるのが嫌だったのでViewStateに入れましたが、Htmlがでかくなるのもなぁ。。あとSessionに入れるのもなんだかなぁ。
ものは試しと、aspxファイルの.NET式でDataSource=" <% コードビハインドのメソッド %>"とやってもコンパイルエラーってどうしたらいいんだ・・・
という思いから質問を投稿した次第ですが、デザイナで宣言したときはViewStateに入っているのであれば、別にバッドプラクティスってわけじゃないんですね。少し安心しました。
重なりますが、ASP.NET MVCの補足まで入れていただいてありがとうございます。非常に為になりました!
No.2
- 回答日時:
なるほど~ 複数のColumn値をDropdownListのSelectedIndexChangedイベントで拾いたいのですね。
おっしゃる通り。DataTableは更新スキームなどを持った、非常にデカいオブジェクトなので、SessionやViewStateに入れることは躊躇するところです。
this.コントロール名.SelectedValueで、選択値が拾えるので、あらかじめBindするCollectionに値を用意してしまうのがいいかもしれません。
ListItemCollection lcol = new ListItemCollection();
foreach (XXXRow row in XXXDataTable) {
ListItem litem = new ListItem(
row.Col1, row.Col2 + "|" + row.Col3);
lcol.Add(litem);
}
this.XXXDropDownList.DataSource = lcol;
this.XXXDropDownList.DataBind();
とすれば、イベントハンドラで"|"分割し、Col2とCol3が得られますね。
LINQtoSQLが使えれば、Col1と、Col2|Col3値連結のコレクションを取得して一発Bindできるんだけどなあ。
何度もご回答いただいてありがとうございます。
ValueFieldに連結して持たせるのはやったことがあるのですが、
意外と使いにくくて・・・
ともすれば
ユーザーコントロールを作ってしまって、連結されたValueFieldをCollectionとして返すプロパティを実装するとか・・・うう~ん。
「そもそもそんな設計にするなよー」てなもんなのかもしれません・・・
LINQtoSQLはまだ使った事ないんですよね・・・
早く使いたいもんです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
0歳児の指しゃぶりに関して
-
Labelコントロールに数字を代入...
-
javascriptからjavaを呼び出したい
-
【sendkeysメソッドが動かずに...
-
配列のメソッド
-
mainメソッドのthrows節で設定...
-
CALLされていないメソッドを見...
-
JAVA言語,JSPによるクイズシス...
-
処理内容がほぼ同じメソッドの...
-
final修飾子を使っているのに、...
-
VBPをダブルクリックするとたま...
-
JSPで<SELECT>の中にDBから持っ...
-
コマンドプロンプト実行後に画...
-
Excel VBA でExcelを終了したい...
-
[VBA]GetSaveAsFilenameメソッ...
-
引数は省略できません。とのコ...
-
eclipse-Tomcatでのデバッグに...
-
VBAでSaveAs使用し、指定してい...
-
エクセルVBAにおけるON TIMEメ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
DataGridViewでセルクリックイ...
-
【sendkeysメソッドが動かずに...
-
コマンドプロンプト実行後に画...
-
VBA コピーが出来ません…!
-
ウィンドウを最前面にできません
-
JSPで<SELECT>の中にDBから持っ...
-
javascriptからjavaを呼び出したい
-
VBPをダブルクリックするとたま...
-
eclipse-Tomcatでのデバッグに...
-
Application.Wait の参照設定
-
エクセルVBAにおけるON TIMEメ...
-
配列のメソッド
-
エクセルのマクロでプリンタを...
-
final修飾子を使っているのに、...
-
drawStringで文字間隔の調整
-
Excel VBA でExcelを終了したい...
-
worksheets & rows メソッドは...
-
CALLされていないメソッドを見...
-
vbaエクセルマクロ RemoveDupli...
おすすめ情報