![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
いつもお世話になっております。
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で質問しましょう!
似たような質問が見つかりました
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- Visual Basic(VBA) データのある範囲を選択するVBAについて 2 2022/09/03 00:20
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- Excel(エクセル) vba 複数の行を非表示の時コードのまとめ方 3 2022/11/17 15:01
- Excel(エクセル) エクセルのVBAにショートカットキーの割り当て 3 2022/07/13 14:19
- Excel(エクセル) エクセルのマクロでコピー後の貼り付け先を毎回指定したところにしたい 5 2022/08/12 10:47
- PHP クエリObjectをforeachで回す時に、次のレコードへ移動せずに次のレコードを取得したい 2 2022/07/28 15:29
- Visual Basic(VBA) ActiveReportのdetailをデータセットの自動バインドを使って帳票を出力しています。 1 2023/08/16 07:16
- IT・エンジニアリング ActiveReportのdetailをデータセットの自動バインドを使って帳票を出力しています。 1 2023/08/16 07:17
- MySQL SQLです。こんな感じですか?あってますか? うまくいきません教えてくださいお願いします 1 2023/07/08 15:27
このQ&Aを見た人はこんなQ&Aも見ています
-
賃貸で可能な古民家風レトロな部屋作りのコツ!改めて知る畳の高い機能性と魅力も紹介
畳の部屋を雰囲気のよい部屋に仕上げたい!賃貸住宅でもできる古民家風のレトロな部屋作りのコツを伺った。
-
ASP.netで、CheckBoxListのSelectedIndexChangedが発生しません!
Microsoft ASP
-
ASPX(C#)で別ファイルで自分で作成したクラスをインスタンスかする
Microsoft ASP
-
GridViewで複数のDropDownListを連携表示しようとして
Microsoft ASP
-
-
4
GridViewの行選択イベントを発生させるには?
JavaScript
-
5
クリックされたセルの位置を取得するには?
JavaScript
-
6
ASP.NET(VB)VBソースからJavascriptの関数を呼ぶには
Microsoft ASP
-
7
TextChangeイベントが発生しない
JavaScript
-
8
【ASP.NET】ページ遷移してもGridView内の値を保持する方法
その他(プログラミング・Web制作)
-
9
【C#】Page_Loadさせない方法について
その他(プログラミング・Web制作)
-
10
Response.Redirectで引数2つの時は?
Microsoft ASP
-
11
ASP.NETでTimerコントロールを使用したい
AJAX
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
JSPで<SELECT>の中にDBから持っ...
-
Labelコントロールに数字を代入...
-
VBPをダブルクリックするとたま...
-
C++/CLIにてForm1の要素に外部から
-
DataGridViewでセルクリックイ...
-
javascriptからjavaを呼び出したい
-
配列のメソッド
-
JAVA コンパイル時のエラー
-
Excel VBA でExcelを終了したい...
-
ODBCでMoveNextがうまく動作し...
-
final修飾子を使っているのに、...
-
コンパイルエラーの理由。
-
ウィンドウを最前面にできません
-
VBA コピーが出来ません…!
-
PDFファイルから別ウィンドウで...
-
IDispatch と dispinterface の...
-
HyperLinkのNavigateUrl属性に...
-
エクセルのマクロでプリンタを...
-
mainメソッドのthrows節で設定...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
mainメソッドのthrows節で設定...
-
final修飾子を使っているのに、...
-
Labelコントロールに数字を代入...
-
onClickで関数呼出し後に、結果...
-
DataGridViewでセルクリックイ...
-
JSPで<SELECT>の中にDBから持っ...
-
コマンドプロンプト実行後に画...
-
Refreshメソッドの使い方
-
エクセルVBAにおけるON TIMEメ...
-
boolean型のフィールドとゲッタ...
-
javascriptからjavaを呼び出したい
-
VBPをダブルクリックするとたま...
-
配列のメソッド
-
【sendkeysメソッドが動かずに...
-
Excel VBA でExcelを終了したい...
-
VB.netで、シリアル通信のタイ...
-
worksheets & rows メソッドは...
-
Application.Wait の参照設定
-
(String args[])というメッソ...
おすすめ情報