dポイントプレゼントキャンペーン実施中!

VBもDBもろくに勉強できていない私が、会社の命令により
納期間近のWebアプリをASP.NETを使い作成することになりました。
知識が乏しいため、本やネットとにらめっこし、トライ&エラーを繰り返しながら奮闘しております。
今回は、調べても似たような事例が見つからなかったので質問させていただきます。


検索用のドロップダウンリストが2つあり、ACCESSのマスターより値を参照してます。
Aのドロップダウンリストのマスターは、

ID 項目名 区分

の3項目で成り立っており、表示に項目名 値にIDを設定しております。

Aの選択を行ったときに、区分の値によって
Bのドロップダウンリストの選択可否を制御したいのですが、
どのようにすればよろしいでしょうか?

何卒、よろしくお願いいたします。

A 回答 (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などで一発抽出すること。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/06/22 13:18

有名な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処理を使うと、パフォーマンスにも影響しますので、できるだけコレクションのような内部変数で済ますのが好みです。

この回答への補足

ご回答ありがとうございます。

本当に知識不足で申し訳ないのですが、

>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開発に生かさせて頂こうと思います。

補足日時:2011/05/26 11:05
    • good
    • 0

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


これができるなら、AのドロップダウンリストのAutoPostBackプロパティをtrueにするだけでOKかと。

この回答への補足

ご回答ありがとうございます。

私の質問が曖昧だったので、趣旨とは違う内容となってしまっています。

今回の場合、リストAの区分の内容は True/False でして、
Trueの場合のみ リストB.Enabled = True に設定したいのです。
ドロップダウンリストAは プロパティとして 区分 を持っていないので、
どうやって取得すればいいかがわかりません。
リストAを選択した際のIDをパラメータとして、別のSQLで取得するしかないでしょうか?
その場合、VBでAccessに接続するかと思いますが、AccessDataSource等は使えないのでしょうか?(まだVBでDB接続をやったことがないので、できれば簡単に設定したいのです。)


また、onosさんが回答してくださった内容ですが、私の理解力不足で、
具体的にどういったケースでどういった動きをしたいのかがわかりません。
よって、どのようなプログラムを書けばいいかも検討がつかない状況です。
お手数でなければ、ご教示願えませんでしょうか?

補足日時:2011/05/23 19:15
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!