- - PR -
2つのDropDownListの連動
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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にあるデータ全てを初回に表示したいと思ったので。 未熟者で申し訳ありませんが,ご教示下さい。宜しくお願い致します。 以 上 | ||||
|
投稿日時: 2009-02-04 19:55
Table1であああが選択されたら
Table2でKey=001 で検索するだけだと思いますが 何が上手く言っていないのでしょうか。 やりたいことはわかるのですが できていないことが不明です。 | ||||
|
投稿日時: 2009-02-04 20:08
あすか様
早速のご連絡ありがとう御座います。 言葉足らずで申し訳ありません。 「検索するだけ」というのは分かっています。 DropDownList1の内容が変わった場合は,コードで記述しなければ ならないのか?(DropDownList1_SelectedIndexChangedイベントにて) それともDropDownList2に割り当ててあるSqlDataSource2の SQL文で定義が可能なのか? が,わかりません。 できれば,コードではなくSqlDataSource2内で 定義できれば理想と思っています。 そのSqlDataSource2で実現させる場合の方法が わかりませんでした。(Formview内配置のリストのため) 色々と申し訳ありませんが,宜しくお願い致します。 以 上 | ||||
|
投稿日時: 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-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 ] | ||||
|
投稿日時: 2009-02-06 22:28
この場合はコード書いてUpdateしちゃったほうがいいんじゃないでしょうか。
この緑囲みのような感じです。 http://www.atmarkit.co.jp/fdotnet/vs2005db/vs2005db_04/vs2005db_04_03.html | ||||
|
投稿日時: 2009-02-09 15:46
べる様 お世話になります。ご連絡ありがとう御座います。 ご教示頂いたページを参考にトライしてみます。 また何かありましたら,ご相談すると思いますが 宜しくお願い致します。 どうもありがとう御座いました。 以 上 |
1