- PR -

2つのDropDownListの連動

1
投稿者投稿内容
ちゃい
会議室デビュー日: 2009/01/21
投稿数: 6
投稿日時: 2009-02-04 19:39
いつもお世話になります。VB.NET初心者のものです。
FormView内に2つのDropDownListを配置して,1つ目の
DropDownListの項目を選択すると,2つ目のDropDownListの
アイテムがDBより絞られるという事をしたいと思っていて
つまづいています。
具体的には,以下のような感じです。

■DBイメージ
<Table1>
Key|名称 |Table2Key
−−−−−−−−−−−
1 |あああ|001
2 |いいい|002
3 |ううう|003
4 |えええ|004
※Table2Key=004のデータはTable2には存在しない。

<Table2>
Key  |項目名
−−−−−−−−−
001|A1
001|A2
001|A3
002|B1
002|B2
003|C1
007|G1
007|G2
※Key=007のデータはTable1.Table2Keyに存在しない。

Table1.Table2Key=Table2.Key(1:n)の関係です。

■実現したい事
<DropDownList1>
1:あああ
2:いいい
3:ううう

Dropdownlist1にて「1:あああ」を選択した場合
DropDownList2の表示アイテムは
<DropDownList2>
001:A1
001:A2
001:A3

としたいのですが,上手くいきません。

<DropDownList1>と<DropDownList2>には各々SqlDataSourceを定義して
やっています。
<DropDownList1>用は,SqlDataSource1 でTable1を参照
<DropDownList2>用は,SqlDataSource2 でTable2を参照

また,DropDownList1で,何が選択されたか?判別すると
いうところまで出来ています。<DropDownList2>のアイテムは
コードを定義してアイテムを設定するしかないのでしょうか?
SqlDataSource2のSQL文(Where句)定義のところで設定できる
のでしょうか?Formview内に配置している事もありすんなりいかず困っています。
DB側でTable1とTable2のViewを定義して,それをSqlDataSourceに
割り当てようとも思ったのですが,Table1にあるデータ全てと
Table2にあるデータ全てを初回に表示したいと思ったので。
未熟者で申し訳ありませんが,ご教示下さい。宜しくお願い致します。

以 上
あすか
ぬし
会議室デビュー日: 2006/07/12
投稿数: 309
投稿日時: 2009-02-04 19:55
Table1であああが選択されたら
Table2でKey=001
で検索するだけだと思いますが
何が上手く言っていないのでしょうか。

やりたいことはわかるのですが
できていないことが不明です。
ちゃい
会議室デビュー日: 2009/01/21
投稿数: 6
投稿日時: 2009-02-04 20:08
あすか様

早速のご連絡ありがとう御座います。
言葉足らずで申し訳ありません。
「検索するだけ」というのは分かっています。
DropDownList1の内容が変わった場合は,コードで記述しなければ
ならないのか?(DropDownList1_SelectedIndexChangedイベントにて)
それともDropDownList2に割り当ててあるSqlDataSource2の
SQL文で定義が可能なのか?
が,わかりません。
できれば,コードではなくSqlDataSource2内で
定義できれば理想と思っています。
そのSqlDataSource2で実現させる場合の方法が
わかりませんでした。(Formview内配置のリストのため)
色々と申し訳ありませんが,宜しくお願い致します。

以 上
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2009-02-05 01:52
デザイナの[データソースの構成]ウィザードで行えば基本的にaspxもcsも自分で書かずにできます。
Formviewの中でなければできていますか?基本的にはやり方は一緒です。

・DropDownList1,SqlDataSource1,DropDownList2,SqlDataSource2は全てFormView内にある
・DropDownList1のvalue項目にはTable2Keyが設定されている
という前提で、

SqlDataSource2の[データソースの構成]で、[WHERE句の追加]のところで
列:Key
演算子:=
ソース:Control
コントロールID:DropDownList1
と設定すればOKなはずです。

あとはどのタイミングでポストバックさせるかでしょう。
(だいたい、DropDownList1のAutoPostBackをtrueにするのが定番でしょうか)
ちゃい
会議室デビュー日: 2009/01/21
投稿数: 6
投稿日時: 2009-02-06 11:18
べる様

ご連絡ありがとう御座います。返信が大変遅くなり申し訳御座いませんでした。
べる様のおっしゃるとおり,Formview−EditItemTemplateの中にDropDownList1・2,
SqlDataSource1・2を配置する事により,実現する事ができるようになりました。
本当にありがとう御座いました。

しかし,新たなる問題が出てしまいました。
2つのDropDownListは,FormView内のEditItemTemplate内に配置しており,
更新用として使用したいため,DataBindingsの編集にて,SelectedValueに
両方向データバインドを設定しています。(Bind("Table2.Key")としている)
そのBindを外せば,べる様のとおりで正常動作するのですが,選択された
内容で更新をさせたいため,Bindを定義すると,次のエラーが発生します。
===エラー内容===
Eval()、XPath()、および Bind() のようなデータバインド メソッドは、データバインドされたコントロールのコンテキストでのみ使用することができます。

Web検索・調査したところ,どっとねっとふぁん様のページにて掲載が
あったので参考にしたのですが,上記のエラーは消えません。
===参考にしたページ===
<http://social.msdn.microsoft.com/forums/ja-JP/aspnetja/thread/a99e5150-ca19-4f3c-9132-dff06da10d8d>

何か方法はありますでしょうか?度々申し訳御座いませんが,ご教示お願い致します。

===FormviewのEditItemTemplate内の定義===
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ・・・・・ %>"
ProviderName="<%$ ・・・・・ %>"
OldValuesParameterFormatString="original_{0}"
SelectCommand="SELECT * FROM [Table1]">
</asp:SqlDataSource>

<asp:SqlDataSource ID="SqlDataSource2" runat="server"
ConnectionString="<%$ ・・・・・ %>"
ProviderName="<%$ ・・・・・ %>"
OldValuesParameterFormatString="original_{0}"
SelectCommand="SELECT * FROM [Table2] WHERE ([Key] = @Key)">
<SelectParameters>
<asp:ControlParameter ControlID="DropDownList1" Name="Key" ←(Table1.Table2Keyの事)
PropertyName="SelectedValue" Type="String" />
</SelectParameters>
</asp:SqlDataSource>

<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True"
DataSourceID="SqlDataSource1" DataTextField="Table1.名称"
DataValueField="Table1.Key"
SelectedValue='<%# Bind("Data1") %>'>
</asp:DropDownList>

<asp:DropDownList ID="DropDownList2" runat="server"
DataSourceID="SqlDataSource2" DataTextField="Table2.項目名"
DataValueField="Table2.Key"
SelectedValue='<%# Bind("Data2") %>'>
</asp:DropDownList>

すみません。VBコード付け忘れました。次のとおりです。
Protected Sub FormView1_DataBound(ByVal sender As Object, ByVal e As System.EventArgs) Handles FormView1.DataBound
If FormView1.CurrentMode = FormViewMode.Edit Then
CType(FormView1.FindControl("DropDownList2"), DropDownList).SelectedValue = _
DataBinder.Eval(FormView1.DataItem, "Key").ToString()
End If
End Sub

[ メッセージ編集済み 編集者: ちゃい 編集日時 2009-02-06 11:57 ]
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2009-02-06 22:28
この場合はコード書いてUpdateしちゃったほうがいいんじゃないでしょうか。

この緑囲みのような感じです。
http://www.atmarkit.co.jp/fdotnet/vs2005db/vs2005db_04/vs2005db_04_03.html
ちゃい
会議室デビュー日: 2009/01/21
投稿数: 6
投稿日時: 2009-02-09 15:46
引用:

べるさんの書き込み (2009-02-06 22:28) より:
この場合はコード書いてUpdateしちゃったほうがいいんじゃないでしょうか。

この緑囲みのような感じです。
http://www.atmarkit.co.jp/fdotnet/vs2005db/vs2005db_04/vs2005db_04_03.html



べる様

お世話になります。ご連絡ありがとう御座います。
ご教示頂いたページを参考にトライしてみます。
また何かありましたら,ご相談すると思いますが
宜しくお願い致します。
どうもありがとう御座いました。

以 上
1

スキルアップ/キャリアアップ(JOB@IT)