• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ASP.NET ドロップダウンリストでの切り分け)

ASP.NET ドロップダウンリストでの切り分け

このQ&Aのポイント
  • VBもDBもろくに勉強できていない私が、会社の命令により納期間近のWebアプリをASP.NETを使い作成することになりました。知識が乏しいため、本やネットとにらめっこし、トライ&エラーを繰り返しながら奮闘しております。
  • 検索用のドロップダウンリストが2つあり、ACCESSのマスターより値を参照してます。Aのドロップダウンリストのマスターは、ID、項目名、区分の3項目で成り立っており、表示には項目名を、値にはIDを設定しています。
  • Aの選択を行ったときに、区分の値によってBのドロップダウンリストの選択可否を制御したいのですが、どのようにすればよろしいでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • aspnet
  • ベストアンサー率79% (72/91)
回答No.3

すごく一般的に考えて、DataSourceは、データセットウィサード画面で作成された、「強い型づけの」DataTableであるDSADataTable型とします。 元のACCESS TableがすでにフィールドIDをキーにしていますので、DSADataTable型においても、項目IDは整数型のキー項目になっているものとします。 ' Sessionからデータソースを復元 Dim DsA as DSADataTable = DirectCast(Session("ds"), DSADataTable) ' DropDownListの選択値を取得して整数型に変換 Dim value as integer = Convert.ToInt32(me.DdlA.SelectedValue) ' 復元したDataTableを検索してRowを抽出 Dim row as DSARow = DsA.Find(value) ' 区分値を求める Dim kubun as boolean = DSARow.kubun if (kubun) then dim item as ListItem = new ListItem("選択不能どす","") me.DdlB.Add(item) me.DdlB.Enabled = false end if すいません。VBほとんどやってないので、インテリセンスなしで打ちまくると合ってる自信ありませんので、1ステップずつ書いたら馬鹿みたいになってます。 まあ細かいことは抜きにしてこんな感じかなあと。 VB文法違っていたら誰か直して(無責任 何かOption StrictやらOption Inferやらあって、もっとはしょった着方ができるらしいんだけど。。 ミソは、「強い型づけの」DataTableをDataSourceにして、キーからFindなどで一発抽出すること。

taeamapa
質問者

お礼

お礼が遅くなってしまい大変申し訳ありません。 やはり私の知識不足で、回答をもらった当初はサッパリだったのですが、 回答を参考にいろいろ調べていった結果、なんとか思惑通りに動いてくれました。 詳しく説明してくださって本当にありがとうございました。

その他の回答 (2)

  • aspnet
  • ベストアンサー率79% (72/91)
回答No.2

有名なonosさんのサジェストのあとでまことに僭越ではありますが。。 DriopDownListの表示方法にはいろんな方法がありますが、基本的には、 DataTableやDictionary、Listなどのコレクション系の変数を準備して、DataSourceとしてDropDownListDataBindします。 その際、DataTextFieldに表示項目、DataValueFieldに選択値を指定します(よね?)。 この、BindしたDataSourceなのですが、ポストバック時に値を参照したいので、あまり大きくないデータであればSessionに入れます。頻出するものなら、最初からGlobal変数にしておいてもいいです。 で、onosさんが仰ったとおり、DropDownListのAutoPostBackプロパティをtrueにして、SelectedIndexChangedイベントが吐かれてPostBackが発生したあと、そのSelectedValueを取り出します。 あとは、Sessionに書かれていたDataSourceであった変数を復帰させ、そこから対応する区分値を取り出せばいいです。 区分値がTrueならばDropDownListBのListItemコレクションを、Key="選択不能です" Value="" のような内容にします。いっそvisible=falseにして消してしまうとかでも。 通常、DropDownListにはあまり大きなコレクションをBindしないので、DataSourceはGlobal変数にするかSessionへの収納がいいのではないでしょうか? 取得したIDをキーにしていちいちDBを読んでもいいですが、細かい処理全部にMDBのような重いDB処理を使うと、パフォーマンスにも影響しますので、できるだけコレクションのような内部変数で済ますのが好みです。

taeamapa
質問者

補足

ご回答ありがとうございます。 本当に知識不足で申し訳ないのですが、 >SelectedIndexChangedイベントが吐かれてPostBackが発生したあと、そのSelectedValueを取り出します。 >あとは、Sessionに書かれていたDataSourceであった変数を復帰させ、そこから対応する区分値を取り出せばいいです。 とのことですが、これは、SelectedValueの値をキーにしてSessionから区分値を持ってくるということでしょうか・・・? その場合、VBではどのように記述すればいいのでしょうか・・・(SQLのような形?) もしくは、SelectedValueにIDと区分の2項目を格納できるということでしょうか? 念のためにもう一度説明します。 DataSourceAは ID 項目名 区分 で成り立っており、 DropDownListで表示させております。 DataTextField に 項目名 DataValueField に ID (検索用のキー項目) を設定しており、 設定外の 区分 によりDropDownListBの表示可否をコントロールしたいのです。 DataSourceAの区分はどのようにして取得すればいいのでしょうか? DropDownListのコレクションについて、DBよりもSessionやGlobal変数にしたほうが良いというアドバイス ありがとうございました。今後のASP.NET開発に生かさせて頂こうと思います。

  • onos
  • ベストアンサー率81% (127/155)
回答No.1

AのドロップダウンリストでSelectedChangedイベントが発生したとき、Bのドロップダウンリストの選択肢を区分の値に合わせたものに設定する、というプログラムは記述できますか? これができるなら、AのドロップダウンリストのAutoPostBackプロパティをtrueにするだけでOKかと。

taeamapa
質問者

補足

ご回答ありがとうございます。 私の質問が曖昧だったので、趣旨とは違う内容となってしまっています。 今回の場合、リストAの区分の内容は True/False でして、 Trueの場合のみ リストB.Enabled = True に設定したいのです。 ドロップダウンリストAは プロパティとして 区分 を持っていないので、 どうやって取得すればいいかがわかりません。 リストAを選択した際のIDをパラメータとして、別のSQLで取得するしかないでしょうか? その場合、VBでAccessに接続するかと思いますが、AccessDataSource等は使えないのでしょうか?(まだVBでDB接続をやったことがないので、できれば簡単に設定したいのです。) また、onosさんが回答してくださった内容ですが、私の理解力不足で、 具体的にどういったケースでどういった動きをしたいのかがわかりません。 よって、どのようなプログラムを書けばいいかも検討がつかない状況です。 お手数でなければ、ご教示願えませんでしょうか?

関連するQ&A

専門家に質問してみよう