トップ回答者
2つのDropDownListの連携について

質問
-
いつも、お世話になります。
FormViewにDropDownListを2つ配置し、DropDownList1(以下、DDL1)が選択されると、DropDownList2(以下、DDL2)には、DDL1で選択された項目のみが表示されるものを開発しています。
たとえば、DDL1で都道府県を選択すると、DDL2に該当の市町村が表示されるような、よくあるパターンです。VWD2008、ASP.NET3.5の開発環境ですが、下記エラーが表示されます。
「Eval()、XPath()、および Bind() のようなデータバインド メソッドは、データバインドされたコントロールのコンテキストでのみ使用することができます。」
これに関連する情報を調べたのですが、下記のサイトでASP.NET3.5のバグ?と挙がっていました。
http://www.surferonwww.info/BlogEngine/2010/10/31/default.aspxこのサイトの情報を参考にして修正したのですが、EditItemTemplate では問題ないとの説明です。
ところが、EditItemTemplate 時にも同様なエラーが発生するため、InsertItemTemplateと同様に修正しました。
確かに更新時には、正常に更新されるのですが、SelectedValue='<%# Eval("XXXX") %>'をセットして、DDL1を選択すると、上記のエラーとなります。
回避方法がありましたら、ご教授をお願いいたします。<asp:DropDownList ID="ed_ddlCategory" runat="server" AutoPostBack="True"
DataSourceID="SqlDataSource4" DataTextField="Category" DataValueField="ID"
onselectedindexchanged="ed_ddlCategory_SelectedIndexChanged"
SelectedValue='<%# Eval("Category") %>'>
</asp:DropDownList>
<asp:SqlDataSource ID="SqlDataSource4" runat="server"
ConnectionString="<%$ ConnectionStrings:DS_Intra_DBConnectionString %>"
SelectCommand="SELECT * FROM [T_Category]">
</asp:SqlDataSource>
<asp:DropDownList ID="ed_ddlClass" runat="server" DataSourceID="SqlDataSource8"
DataTextField="ClassName" DataValueField="ClassCode"
SelectedValue='<%# Eval("Class") %>'>
</asp:DropDownList>
<asp:SqlDataSource ID="SqlDataSource8" runat="server"
ConnectionString="<%$ ConnectionStrings:DS_Intra_DBConnectionString %>"
SelectCommand="SELECT * FROM [T_Class] WHERE ([CategoryCode] = @CategoryCode)">
<SelectParameters>
<asp:ControlParameter ControlID="ed_ddlCategory" Name="CategoryCode"
PropertyName="SelectedValue" Type="Int32" />
</SelectParameters>
</asp:SqlDataSource>
回答
-
FormView の構成、バインドしているデータがわかりませんのでハズレ
かもしれませんが・・・以下のスレッドで問題となったことと同じではないですか? Zigen さ
んのケースに当てはまるかどうかわかりませんが、回避策も提案されて
いますので、見てください。DetailsViewの中に、多段階のDropDownListを配置できない
http://social.msdn.microsoft.com/forums/ja-JP/vwdexpressja/thread/cd699bd4-3606-4713-aed4-e7785e288b6b/2つのDropDownListの連動し、更にFormViewで修正する
http://social.msdn.microsoft.com/Forums/ja-JP/aspnetja/thread/2638bff4-3e22-44e0-9097-7e06c6bb1e03上記のスレッドを読んでも解決できなければ、また質問してください。
その際は、FormView の構成、バインドしているデータ、
ed_ddlCategory_SelectedIndexChanged、その他影響を与えそうな部分も
書いてください。- 回答としてマーク Zigen 2010年12月4日 13:54
すべての返信
-
> これに関連する情報を調べたのですが、下記のサイトでASP.NET3.5のバ
> グ?と挙がっていました。
> http://www.surferonwww.info/BlogEngine/2010/10/31/default.aspxそれは ListView の話で、FormView ではそのような問題はないはずです。
やっていることがよく分からないので、解決策は示しようがないですが、
FormView を含む全体の概要とか、Table のスキーマなどの情報を提示して
もらえればお役に立てるかもしれません。ただし、前みたいに途中で投げ出さないでくださいね。
-
SurferOnWww様
返信ありがとうございます。
FormView上では問題ないということが分かり、私の作成方法がまずいということで反省しています。
また、前回途中で投げ出したというご指摘、反省しています。ただし、私自身としては、初心者であるため回答いただいた内容についていくことができず、一旦、本当に頭を整理したかったのはうそではありませんでした。で、ご質問のとおり、テーブルのスキーマを追記しました。
また、aspxのソースも折り返して見づらいので再アップしました。(一部修正していますのでこちらを参照ください)
やりたいことは、前述の通り、FormViewでDDL1で選択されたカテゴリに属するDDL2のクラスのみ表示することです。FormViewではInsertモード及びEditモードで利用します。
aspx.vbには特に記述が必要ないものと思っています。
現象は、DDL1を選択すると、DDL2の下記の箇所で「Eval()、XPath()、および Bind() のような・・・」のエラーが発生します。以上、御手数をおかけいたしますが、よろしくお願いいたします。
<asp:DropDownList ID="ed_ddlCategory" runat="server" AutoPostBack="True"
DataSourceID="SqlDataSource4" DataTextField="Category" DataValueField="ID"
onselectedindexchanged="ed_ddlCategory_SelectedIndexChanged"
SelectedValue='<%# Bind("Category") %>'>
</asp:DropDownList><asp:SqlDataSource ID="SqlDataSource4" runat="server"
ConnectionString="<%$ ConnectionStrings:DS_Intra_DBConnectionString %>"
SelectCommand="SELECT * FROM [T_Category]">
</asp:SqlDataSource><asp:DropDownList ID="ed_ddlClass" runat="server" ← ★ここでエラー
DataSourceID="SqlDataSource8"
DataTextField="ClassName" DataValueField="ClassCode"
SelectedValue='<%# Bind("ClassID") %>'>
</asp:DropDownList><asp:SqlDataSource ID="SqlDataSource8" runat="server"
ConnectionString="<%$ ConnectionStrings:DS_Intra_DBConnectionString %>"
SelectCommand="SELECT * FROM [T_Class] WHERE ([CategoryCode] = @CategoryCode)">
<SelectParameters>
<asp:ControlParameter ControlID="ed_ddlCategory" Name="CategoryCode"
PropertyName="SelectedValue" Type="Int32" />
</SelectParameters>
</asp:SqlDataSource>
テーブルはスキームは下記の通りです。
[T_Category]
ID int カテゴリNo.
Category nvarchar(50) カテゴリ名
:[T_Class]
ID int IDENTITY
ClassCode int クラスno.
ClassName nvarchar(50) クラス名
CategoryCode int カテゴリNo.
:[T_Uriage]・・・ 最終的に格納されるテーブル
:
Category int カテゴリNo.
ClassID int クラスNo.
:
[T_Uriage]には[T_Category][T_Class]がリレーションされています。- 編集済み Zigen 2010年12月2日 11:40 表現変更
-
FormView の構成、バインドしているデータがわかりませんのでハズレ
かもしれませんが・・・以下のスレッドで問題となったことと同じではないですか? Zigen さ
んのケースに当てはまるかどうかわかりませんが、回避策も提案されて
いますので、見てください。DetailsViewの中に、多段階のDropDownListを配置できない
http://social.msdn.microsoft.com/forums/ja-JP/vwdexpressja/thread/cd699bd4-3606-4713-aed4-e7785e288b6b/2つのDropDownListの連動し、更にFormViewで修正する
http://social.msdn.microsoft.com/Forums/ja-JP/aspnetja/thread/2638bff4-3e22-44e0-9097-7e06c6bb1e03上記のスレッドを読んでも解決できなければ、また質問してください。
その際は、FormView の構成、バインドしているデータ、
ed_ddlCategory_SelectedIndexChanged、その他影響を与えそうな部分も
書いてください。- 回答としてマーク Zigen 2010年12月4日 13:54
-
SurferOnWww様
返信ありがとうございます。
回答がおそくなりました。
教えていただいた情報を参考にして、うまく動くようになりました。
実際に修正した箇所は、
まず、aspxのDropDownList2のSelectedValueでBindできないため、FormView1_DataBoundで
If FormView1.CurrentMode = FormViewMode.Edit Then
CType(FormView1.FindControl("ed_ddlClass"), DropDownList).SelectedValue =
FormView1.DataItem("ClassCode")
End If
を記述しました。
また、T_UriageテーブルのSqlDataSource1_Updatingで
e.Command.Parameters("@Category").Value =
CType(FormView1.FindControl("ed_ddlCategory"), DropDownList).SelectedValue
e.Command.Parameters("@ClassID").Value =
CType(FormView1.FindControl("ed_ddlClass"), DropDownList).SelectedValue
と記述しました。2つのDropDownListの連携というのは、一般的によく使われていることからもっと簡単に(コーディングなしに)実現できるものと思い込んでいました。
解決のヒントを戴きありがとうございました。
今後ともよろしくお願いします。 -
> 実際に修正した箇所は、
他に SelectedValue='<%# Bind("ClassID") %>' を削除したのではないで
すか?また、SelectedValue='<%# Bind("Category") %>' は削除せず元のまま残
していると思いますが、そうであれば以下は不要なはずです。> e.Command.Parameters("@Category").Value =
> CType(FormView1.FindControl("ed_ddlCategory"), DropDownList).SelectedValue
それから、解決したのであれば、このスレッドは閉じてください。前のス
レッドも、放置したままにしておかないようお願いします。