none
複数のDropDownListを相互連動させたい RRS feed

  • 質問

  • 初心者です(VS205、VB、SQLserver2008R2)

    フォーム上に SqlDataSource1と連動したDropDownList1 と

    SqlDataSource2 と連動したDropDownList2 があり

    DropDownList1で選択した値をSqlDataSource2でWhere条件としています。

    DropDownList1にメンバを「全選択」 Value値を0として

    DropDownList2のリストをすべて表示させたいのですが、方法がわかりません。

    更に、上記の設定を行った際に DropDownList1を選択する度に

    DropDownList2のデータリストが行った選択分増えてしまいます。

    実際の例が難しくなりすぎてソースコードが添付できないのですが

    行いたいことは以下のようになります。

    DropDownList1 : 地域コード と 地域名称

    DropDownList2 : 店舗コード と 店舗名称 と 地域コード

    例えば 

    1.画面を最初に表示した際、DropDownList1に全選択が表示され

      DropDownList2 全店舗が選択可能にしたい。

    2.DropDownList2で任意の店舗を選択した場合に

      DropDownList1の地域がDropDownList2の地域コードと同じ

      地域に選択される。

    3.最後に現在の異常事態ですが

      DropDownList1で地域を選択すると

      DropDownList2の内容が正しく地域限定の店舗が表示されるのですが

      DropDownList1から異なる地域を再選択すると、DropDownList2の内容が

      追加表示されてしまいます。

    以上ですが、よろしくお願いいたします。

    2012年5月13日 8:13

回答

  • > DropDownList1から異なる地域を再選択すると、DropDownList2の内容が
    > 追加表示されてしまいます

    何故そうなるのか分かりませんが、以下のようにすればそのようなことは
    ありません。

    データベースは Microsoft のサンプル Northwind の Categories テーブ
    ル(地域コード と 地域名称 相当)と Products テーブル(店舗コード 
    と 店舗名称 相当)を使用しています。

    <%@ Page Language="C#" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <script runat="server">
    
    </script>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
                ConnectionString="<%$ ConnectionStrings:Northwind %>" 
                SelectCommand="SELECT [CategoryID], [CategoryName] FROM [Categories]">
            </asp:SqlDataSource>
            <asp:DropDownList ID="DropDownList1" 
                runat="server" 
                DataSourceID="SqlDataSource1" 
                DataTextField="CategoryName" 
                DataValueField="CategoryID" 
                AutoPostBack="True" 
                AppendDataBoundItems="True">
                <asp:ListItem Value="0">全選択</asp:ListItem>
            </asp:DropDownList>
            <br />
            <asp:SqlDataSource ID="SqlDataSource2" runat="server" 
                ConnectionString="<%$ ConnectionStrings:Northwind %>" 
                SelectCommand="SELECT [ProductID], [ProductName] 
                    FROM [Products] 
                    WHERE (@CategoryID = 0 OR [CategoryID] = @CategoryID)">
                <SelectParameters>
                    <asp:ControlParameter ControlID="DropDownList1" 
                        Name="CategoryID" 
                        PropertyName="SelectedValue" 
                        Type="Int32" />
                </SelectParameters>
            </asp:SqlDataSource>
            <asp:DropDownList ID="DropDownList2" 
                runat="server" 
                DataSourceID="SqlDataSource2" 
                DataTextField="ProductName" 
                DataValueField="ProductID">
            </asp:DropDownList>
        </div>
        </form>
    </body>
    </html>
    

    • 回答としてマーク pythonk 2012年5月14日 14:08
    2012年5月13日 9:57
  • 推測ですけど、 SqlDataSource2 って DataAdapter の Fill とか使ってデータ取得してますか?
    もしかしてSQL発行して取得したデータを1行ずつ追記Addしてませんか?

    現象だけを聞くと、DataTableをクリアせずにひたすらDataRowをAddしているかと・・・

    見当違いだったらすいません。

    • 回答の候補に設定 pythonkk 2012年5月14日 3:56
    • 回答の候補の設定解除 pythonkk 2012年5月14日 3:56
    • 回答としてマーク pythonk 2012年5月14日 14:08
    2012年5月14日 0:23

すべての返信

  • > DropDownList1から異なる地域を再選択すると、DropDownList2の内容が
    > 追加表示されてしまいます

    何故そうなるのか分かりませんが、以下のようにすればそのようなことは
    ありません。

    データベースは Microsoft のサンプル Northwind の Categories テーブ
    ル(地域コード と 地域名称 相当)と Products テーブル(店舗コード 
    と 店舗名称 相当)を使用しています。

    <%@ Page Language="C#" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <script runat="server">
    
    </script>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
                ConnectionString="<%$ ConnectionStrings:Northwind %>" 
                SelectCommand="SELECT [CategoryID], [CategoryName] FROM [Categories]">
            </asp:SqlDataSource>
            <asp:DropDownList ID="DropDownList1" 
                runat="server" 
                DataSourceID="SqlDataSource1" 
                DataTextField="CategoryName" 
                DataValueField="CategoryID" 
                AutoPostBack="True" 
                AppendDataBoundItems="True">
                <asp:ListItem Value="0">全選択</asp:ListItem>
            </asp:DropDownList>
            <br />
            <asp:SqlDataSource ID="SqlDataSource2" runat="server" 
                ConnectionString="<%$ ConnectionStrings:Northwind %>" 
                SelectCommand="SELECT [ProductID], [ProductName] 
                    FROM [Products] 
                    WHERE (@CategoryID = 0 OR [CategoryID] = @CategoryID)">
                <SelectParameters>
                    <asp:ControlParameter ControlID="DropDownList1" 
                        Name="CategoryID" 
                        PropertyName="SelectedValue" 
                        Type="Int32" />
                </SelectParameters>
            </asp:SqlDataSource>
            <asp:DropDownList ID="DropDownList2" 
                runat="server" 
                DataSourceID="SqlDataSource2" 
                DataTextField="ProductName" 
                DataValueField="ProductID">
            </asp:DropDownList>
        </div>
        </form>
    </body>
    </html>
    

    • 回答としてマーク pythonk 2012年5月14日 14:08
    2012年5月13日 9:57
  • 推測ですけど、 SqlDataSource2 って DataAdapter の Fill とか使ってデータ取得してますか?
    もしかしてSQL発行して取得したデータを1行ずつ追記Addしてませんか?

    現象だけを聞くと、DataTableをクリアせずにひたすらDataRowをAddしているかと・・・

    見当違いだったらすいません。

    • 回答の候補に設定 pythonkk 2012年5月14日 3:56
    • 回答の候補の設定解除 pythonkk 2012年5月14日 3:56
    • 回答としてマーク pythonk 2012年5月14日 14:08
    2012年5月14日 0:23
  • すでにレスがついて話が進んでいますが、

    内容を見る限りでは、Visual Basicのフォーラムで質問すべき内容だと思います。
    ここのフォーラムは特定の言語に依存しない問題を話題にするフォーラムだと思いますので。

    Visual Basic 2005の話題だと思うので今回は仕方ないとしても次からは投稿するフォーラムを変えたほうがよいと思いますよ。


    解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。

    2012年5月14日 7:53
  • aviator__ さん>

    > 現象だけを聞くと、DataTableをクリアせずにひたすらDataRowをAddし
    > ているかと・・・

    SqlDataSource + DropDownList ということなので、ASP.NET ベースの Web
    アプリの話、つまりステートレス(サーバーが応答を返した後は DataTable
    のインスタンスは存在しない)なので、特別なことをしない限り、それはで
    きないはずです。

    特別なこととは、例えば、DataTable を Session に保持して、DataAdapter
    で Fill するというようなことですが、そのようなことをしているのでしょ
    うか?> pythonk さん

    2012年5月14日 11:56
  • 皆さん、

    初めての質問にお付き合いくださいましてありがとうございます。

    まだ完全には理解できていないので、続きは

    場所を変えて、Visual Basic 2005 フォーラムにて相談させていただきます。

    ご親切に、ありがとうございました。

    2012年5月14日 14:15
  • > 現象だけを聞くと、DataTableをクリアせずにひたすらDataRowをAddし
    > ているかと・・・

    SqlDataSource + DropDownList ということなので、ASP.NET ベースの Web
    アプリの話、つまりステートレス(サーバーが応答を返した後は DataTable
    のインスタンスは存在しない)なので、特別なことをしない限り、それはで
    きないはずです。

    それはわかっているんですが、それ以外考えられなかったもので・・・

    他にもっと原因として可能性高いの考えられますかね?

    2012年5月15日 6:39