none
2つのDropDownListの連携について RRS feed

  • 質問

  • いつも、お世話になります。

    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>
     

    2010年12月1日 9:37

回答

すべての返信

  • > これに関連する情報を調べたのですが、下記のサイトでASP.NET3.5のバ
    > グ?と挙がっていました。
    > http://www.surferonwww.info/BlogEngine/2010/10/31/default.aspx

    それは ListView の話で、FormView ではそのような問題はないはずです。

    やっていることがよく分からないので、解決策は示しようがないですが、
    FormView を含む全体の概要とか、Table のスキーマなどの情報を提示して
    もらえればお役に立てるかもしれません。

    ただし、前みたいに途中で投げ出さないでくださいね。

    2010年12月1日 13:56
  • 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 表現変更
    2010年12月2日 1:32
  • 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
    2010年12月2日 13:08
  • 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の連携というのは、一般的によく使われていることからもっと簡単に(コーディングなしに)実現できるものと思い込んでいました。
    解決のヒントを戴きありがとうございました。
    今後ともよろしくお願いします。

     

    2010年12月4日 2:05
  • > 実際に修正した箇所は、

    他に SelectedValue='<%# Bind("ClassID") %>' を削除したのではないで
    すか?

    また、SelectedValue='<%# Bind("Category") %>' は削除せず元のまま残
    していると思いますが、そうであれば以下は不要なはずです。

    > e.Command.Parameters("@Category").Value =
    >   CType(FormView1.FindControl("ed_ddlCategory"), DropDownList).SelectedValue


    それから、解決したのであれば、このスレッドは閉じてください。前のス
    レッドも、放置したままにしておかないようお願いします。

    2010年12月4日 8:45