トップ回答者
DropDownLIstとの連結・非連結の切替

質問
-
以前「カレンダーコントロールに予定の件名を表示したい」でお世話になったhot!mtです。また質問させてください。
前回は、ScheduleというTable(構成はID,Date,StrTime,EndTime,Title,Place,Note,Type)を
CalDateで参照するSqlDataSource(=SqlDataCal)を作成して、
カレンダーコントロールの日付のセルにSchedule.Titleを表示するコードについてご教示いただきました。
それで今回は、もう一つTypeというTable(構成はID,TypeName)を作成してDropDownList1に連結し、
それからSqlDataCalでSchedule.TypeとType.IDを繋ぎ、パラメータにDropDownList1を加えました。
端的に言えば、DropDownList1で選択したTypeのScheduleのみカレンダーコントロールに反映させようというわけです。
ここで質問なのですが、DropDownList1でTypeを絞って反映させる処理と、
例えばTable.TypeにID=99,TypeName=全てを追加して、
あえてTypeで絞らずに反映させる処理を両立させたい場合どういうやり方があるのでしょうか?
とりあえず、パラメータにDropDownList1にもつSqlDataCalともたないSqlDataCal2を作成して、
カレンダーコントロールのDayRenderイベント内でDropDownList1の値が99かどうかでどちらのSqlDataSourceを使うか選択するようにしてみました。
ただし、この案だと反映させる先がカレンダーコントロールではなくGridViewの場合は、
「DataSource動的に変化させることはできません?(うろ覚えですいません)」と怒られてしまいます。
こういった場合、どういったやり方がスマートで応用が利くのでしょうか?よろしくお願いします。
(長文ですいません)
回答
-
-
99にこだわるのならばSQL文でcaseを使うことになりますが、nullでもよければIsNullも使えます。
もっと複雑なケースになれば、SqlDataSourceにストアドプロシージャを割り当て、そのストアドプロシージャ内でSQL文を組み立てたり、ObjectDataSourceを使うことになります。私は、通常であればストアドプロシージャで組み立てる方法を選びます。ストアドプロシージャにしておくと、いろんなところから使えるので(例えばWindowsフォームアプリなどからも)、汎用性があるからです。また、速度的にも有利だと思います。ストアドプロシージャでダメな時には、ObjectDataSourceの登場となります。
-
あと、SqlDataSource1.SelectCommandを動的に変更する方法もありますね。
検索機能
http://forums.microsoft.com/msdn-ja/ShowPost.aspx?PostID=575040&SiteID=7#この方法を紹介するのを忘れてました。(^^;
すべての返信
-
-
99にこだわるのならばSQL文でcaseを使うことになりますが、nullでもよければIsNullも使えます。
もっと複雑なケースになれば、SqlDataSourceにストアドプロシージャを割り当て、そのストアドプロシージャ内でSQL文を組み立てたり、ObjectDataSourceを使うことになります。私は、通常であればストアドプロシージャで組み立てる方法を選びます。ストアドプロシージャにしておくと、いろんなところから使えるので(例えばWindowsフォームアプリなどからも)、汎用性があるからです。また、速度的にも有利だと思います。ストアドプロシージャでダメな時には、ObjectDataSourceの登場となります。
-
あと、SqlDataSource1.SelectCommandを動的に変更する方法もありますね。
検索機能
http://forums.microsoft.com/msdn-ja/ShowPost.aspx?PostID=575040&SiteID=7#この方法を紹介するのを忘れてました。(^^;
-
ご回答いただいた皆さんありがとうございました。すばらしく的確な内容の回答で驚かされました。
とりあえず私は、
DropDownListに<asp:ListItem Value="">全て</asp:ListItem>を、
SqlDataCalにType=@Type OR Type=IsNull(@Type,Type) とCancelSelectOnNullParameter="False"
を追加しました。
実はSqlDataSourceのSelectを動的に変化させる方法しか思いつかず、試してみてはいたのですが、
記述が多くなってしまうし、メンテが大変そうだし、何よりどうもスマートでないなーと頭を悩ませてました。
選択した方法では、DropDownListで全てを選択すればValue=""なのでIsNullとして動作しますし、
関連する箇所ではSqlDataSourceをいじるだけなんで、多少邪道な気はしますが、手っ取り早くて個人的に気に入りました。
スマートで応用が利く方法は?とか質問しておいて何ですけども......ごめんなさい。
まぁともかく、ありがとうございました。次にお世話になるとにも何卒よろしくお願いします。