VBもDBもろくに勉強できていない私が、会社の命令により
納期間近のWebアプリをASP.NETを使い作成することになりました。
知識が乏しいため、本やネットとにらめっこし、トライ&エラーを繰り返しながら奮闘しております。
今回は、調べても似たような事例が見つからなかったので質問させていただきます。
検索用のドロップダウンリストが2つあり、ACCESSのマスターより値を参照してます。
Aのドロップダウンリストのマスターは、
ID 項目名 区分
の3項目で成り立っており、表示に項目名 値にIDを設定しております。
Aの選択を行ったときに、区分の値によって
Bのドロップダウンリストの選択可否を制御したいのですが、
どのようにすればよろしいでしょうか?
何卒、よろしくお願いいたします。
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などで一発抽出すること。
お礼が遅くなってしまい大変申し訳ありません。
やはり私の知識不足で、回答をもらった当初はサッパリだったのですが、
回答を参考にいろいろ調べていった結果、なんとか思惑通りに動いてくれました。
詳しく説明してくださって本当にありがとうございました。
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処理を使うと、パフォーマンスにも影響しますので、できるだけコレクションのような内部変数で済ますのが好みです。
この回答への補足
ご回答ありがとうございます。
本当に知識不足で申し訳ないのですが、
>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開発に生かさせて頂こうと思います。
No.1
- 回答日時:
AのドロップダウンリストでSelectedChangedイベントが発生したとき、Bのドロップダウンリストの選択肢を区分の値に合わせたものに設定する、というプログラムは記述できますか?
これができるなら、AのドロップダウンリストのAutoPostBackプロパティをtrueにするだけでOKかと。
この回答への補足
ご回答ありがとうございます。
私の質問が曖昧だったので、趣旨とは違う内容となってしまっています。
今回の場合、リストAの区分の内容は True/False でして、
Trueの場合のみ リストB.Enabled = True に設定したいのです。
ドロップダウンリストAは プロパティとして 区分 を持っていないので、
どうやって取得すればいいかがわかりません。
リストAを選択した際のIDをパラメータとして、別のSQLで取得するしかないでしょうか?
その場合、VBでAccessに接続するかと思いますが、AccessDataSource等は使えないのでしょうか?(まだVBでDB接続をやったことがないので、できれば簡単に設定したいのです。)
また、onosさんが回答してくださった内容ですが、私の理解力不足で、
具体的にどういったケースでどういった動きをしたいのかがわかりません。
よって、どのようなプログラムを書けばいいかも検討がつかない状況です。
お手数でなければ、ご教示願えませんでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript セレクトを全て選択されていないと、文字によるエラーメッセージを表示させるコードを調べています 2 2023/06/22 15:48
- Excel(エクセル) Excel ドロップダウンリスト(入力規則)に関してです データの入力規則で元データ79000行のド 3 2023/07/17 10:06
- Excel(エクセル) エクセルで値ではなく関数を参照する方法 6 2023/03/19 00:50
- Excel(エクセル) エクセルについて教えてください。 2 2023/06/14 11:11
- JavaScript jsで診断コンテンツのページ内切り替えについて 1 2023/04/14 17:31
- Access(アクセス) Access DTPickerの初期表示月を変えたい 1 2022/08/02 08:55
- Excel(エクセル) エクセルの散布図で新たに入力した値のデータラベルが空欄になる現象 1 2022/04/26 09:31
- Excel(エクセル) 【Excel】指定のセル内容を基に別シートのセルを検索して選択する【VBA】 1 2022/06/16 16:16
- Excel(エクセル) IF 関数で「〇〇 という文字を含む場合」の分岐処理で表示された数字はSUMで数字集計できますか? 3 2022/08/02 16:29
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テキストボックスのvalueとtext...
-
C#の質問です
-
値を返さないコード パス
-
変数名の取得
-
[VBA]選択範囲の下から上に処理...
-
Powershellのparamについて
-
VB初心者。小数点以下の表示で...
-
VBA(自然数)
-
一番後ろのスラッシュ以降を削...
-
マクロ 特定のセル値のみクリ...
-
Request.QueryString への値の...
-
VB.NETでアクティブなformを知...
-
textboxとLabelを動的に変更する
-
【C++/CLI.NET】コンボボックス...
-
ComboBoxで選択した値をReplace...
-
VBでBtrieveファイルにアクセス...
-
ReportViewerでのパラメータ設定
-
VB.NETでコンボボックスの1行目...
-
COBOLの条件式について
-
C# get set
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テキストボックスのvalueとtext...
-
ハッシュテーブル(連想配列)が...
-
Excel VBAのリストボックスの値...
-
マクロ 特定のセル値のみクリ...
-
PysimpleGUIでデータベースを作る
-
VB.NETでコンボボックスの1行目...
-
変数名の取得
-
power BI クエリエディター 〇...
-
VB初心者。小数点以下の表示で...
-
PL/SQLでのTO_DATEの時間取得に...
-
【C++/CLI.NET】コンボボックス...
-
値を返さないコード パス
-
Powershellのparamについて
-
Excel VBA 複数選択したリスト...
-
DataTableに対するLINQについて
-
ユーザーフォームのテキストボ...
-
C# get set
-
変数に代入してある数値を表示...
-
VBAでWEB上の入力項目に値をい...
-
VB.NETでアクティブなformを知...
おすすめ情報