none
絞込みを行うDropDownListにSession変数をセットできない RRS feed

  • 質問

  • 絞込みを行うDropDownListがある検索画面で条件を入力後、結果を表示し、検索画面に戻った場合、条件を初期セットしたいのですが、うまくいかず行き詰ってしまいました。

     

    詳細内容は以下のとおりです。

     

    ・DropDownList3はDropDownList2の内容で絞込み

    ・DropDownList4はDropDownList3の内容で絞込み

     

    条件入力後、Session変数(”seBunruiCD”)にDropDownList4のデータを保存し、結果を表示。(”list.aspx”)

    戻ってきた場合Session変数の内容からDropDownList2,DropDownList3,DropDownList4にデータを表示させたい。

    DropDownList2はSession変数(”seBunruiCD”)の左2文字,

    DropDownList3はSession変数(”seBunruiCD”)の左3文字,

    DropDownList4はSession変数(”seBunruiCD”)の内容を表示させる。

     

    結果としてはDropDownList2にデータは表示されるのですが、DropDownList3,DropDownList4にデータが表示されません。

    ソースを添付しますので、よろしくお願いします。

     

     

     

     

    <%@ Page Language="VB" ValidateRequest="false" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <script runat="server">


        Protected Sub cmdSearch_Click(ByVal sender As Object, ByVal e As System.EventArgs)
            'ドロップダウンのデータをセッションに保存
            Session("seBunruiCD") = Request.Form("DropDownList4").ToString
           
            '結果を表示する
            Server.Transfer("./list.aspx")
        End Sub

     

        Protected Sub DropDownList2_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs)
            DropDownList3.DataBind()
        End Sub

     

        Protected Sub DropDownList3_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs)
            DropDownList4.DataBind()
        End Sub

     

        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
            '起動時または、検索結果一覧から戻った場合
            If Not IsPostBack Then
                'セッションが残っていた場合(前画面から戻った場合、入力条件を表示)
                If IsNothing(Session("seBunruiCD")) = False Then
                    DropDownList2.SelectedValue = Left(Session("seBunruiCD"), 2)
                    DropDownList3.SelectedValue = Left(Session("seBunruiCD"), 3)
                    DropDownList4.SelectedValue = Session("seBunruiCD")
                End If
            End If
        End Sub

     

     

    </script>

    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head id="Head1" runat="server">
        <title>資料検索システム</title>
    <script language="javascript" type="text/javascript">
    <!--

    // -->
    </script>
    </head>
    <body style="font-size: 12pt">
        <form id="form1" runat="server">
        <div style="text-align: center" >
            &nbsp;</div>
            <table style="width: 600px" align="center">
                <tr>
                    <td colspan="2" style="height: 45px; text-align: center;">
                        &nbsp;<asp:Button ID="cmdSearch" runat="server" Text="検索" Width="60px" OnClick="cmdSearch_Click"/></td>
                </tr>
                <tr>
                    <td style="width: 87px; height: 24px; text-align: center;" align="center">
                        分類1</td>
                    <td style="width: 140px; height: 24px" align="left" nowrap="noWrap"><aspBig SmileropDownList ID="DropDownList2" runat="server" AutoPostBack="True" DataSourceID="SqlDataSource2" DataTextField="大分類" DataValueField="分類CD12" OnSelectedIndexChanged="DropDownList2_SelectedIndexChanged">
                    </aspBig SmileropDownList>
                        <aspTongue TiedqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:cnSiryou %>"
                            SelectCommand="SELECT LEFT (分類CD, 2) AS 分類CD12, 大分類, 分類CD FROM M_Bunrui WHERE (分類CD LIKE '%' + '00') ORDER BY LEFT (分類CD, 2)">
                        </aspTongue TiedqlDataSource>
                        </td>
                </tr>
                <tr>
                    <td style="width: 87px; text-align: center;" align="center">
                        分類2</td>
                    <td style="width: 140px" align="left" nowrap="noWrap"><aspBig SmileropDownList ID="DropDownList3" runat="server" AutoPostBack="True" DataSourceID="SqlDataSource3" DataTextField="中分類" DataValueField="分類CD13" OnSelectedIndexChanged="DropDownList3_SelectedIndexChanged">
                    </aspBig SmileropDownList>
                        <aspTongue TiedqlDataSource ID="SqlDataSource3" runat="server" ConnectionString="<%$ ConnectionStrings:cnSiryou %>"
                            SelectCommand="SELECT 分類CD, LEFT (分類CD, 3) AS 分類CD13, RIGHT (LEFT (分類CD, 3), 1) AS 分類CD3, 中分類 FROM M_Bunrui WHERE (分類CD LIKE @分類CD + '%' + '0')" ProviderName="<%$ ConnectionStrings:cnSiryou.ProviderName %>">
                            <SelectParameters>
                                <asp:ControlParameter ControlID="DropDownList2" Name="分類CD" PropertyName="SelectedValue"
                                    Type="String" />
                            </SelectParameters>
                        </aspTongue TiedqlDataSource>
                        </td>
                </tr>
                <tr>
                    <td style="width: 87px; text-align: center;" align="center">
                        分類3</td>
                    <td style="width: 140px" align="left" nowrap="noWrap"><aspBig SmileropDownList ID="DropDownList4" runat="server" AutoPostBack="True" DataSourceID="SqlDataSource4" DataTextField="小分類" DataValueField="分類CD">
                    </aspBig SmileropDownList>
                        <aspTongue TiedqlDataSource ID="SqlDataSource4" runat="server" ConnectionString="<%$ ConnectionStrings:cnSiryou %>"
                            SelectCommand="SELECT 分類CD, 小分類 FROM M_Bunrui WHERE (分類CD LIKE @P分類CD13 + '%')">
                            <SelectParameters>
                                <asp:ControlParameter ControlID="DropDownList3" Name="P分類CD13" PropertyName="SelectedValue" />
                            </SelectParameters>
                        </aspTongue TiedqlDataSource>
                        </td>
                </tr>
            </table>
        </form>
    </body>
    </html>

    2007年10月19日 2:07

回答

  • どっとねっとふぁん様

    お世話になります。

    Page_PreRenderCompleteイベントが一覧に無かった?(ヘルプはあるのに)ので、Page_PreRenderイベントに以下のように記述したところ、データソースやDropDownListを再設定することなく短いコードで思い通りの動きをしてくれました。

    長々としたコードも不要になり、すっきりしました。

    ありがとうございました。

     

    コード ブロック

        Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs)
            If Not IsPostBack Then
                If IsNothing(Session("seBSyubetsu")) = False Then     'セッションが残っていた場合(前画面から戻った場合、入力条件を表示)
                    DropDownList2.SelectedValue = Left(Session("seBunruiCD"), 2)
                    DropDownList2.DataBind()
                    DropDownList3.SelectedValue = Left(Session("seBunruiCD"), 3)
                    DropDownList3.DataBind()
                    DropDownList4.SelectedValue = Session("seBunruiCD").ToString
                    DropDownList4.DataBind()
                End If
            End If
        End Sub

     

    2007年10月19日 8:35

すべての返信

  • DropDownList3,DropDownList4について、それぞれDataBindを行ったうえでSelectedValueを設定してみてはどうでしょう。

    2007年10月19日 4:54
  • ご回答ありがとうございます。

     

    DataBindも追加して見ましたが、DropDownList3、DropDownList4とも空欄になって一覧データがクリアされてしまいます。

    デバッグモードのシングルステップでデータ遷移を見てみると、DropDownList2.SelectedValueでデータをセットしたステップではDropDownList2にはデータがセットされていない?ようで、Loadイベントがすべて終了した時点でセットされているようです。

    そのためかDataBindしても空欄になってしまいます。

     

    そこで、下記の赤文字のようにデータソースとDropDownList3,DropDownList4の再設定を行いました。

    それぞれの1回目のDataBindでSessionデータを元にデータをセット。

    2回目のDataBindでDropDownList2,3,4の変更があった場合に表示が変更可能なように再セット。

    SelectedIndexChangedでも設定。

    とりあえずこれでデータは表示できるようになりましたが、他にいい方法があるような気がします。

    また、不要なコードがあれば教えていただきたいと思います。

     

     

     

       

    コード ブロック

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
            '起動時または、検索結果一覧から戻った場合
            If Not IsPostBack Then
                'セッションが残っていた場合(前画面から戻った場合、入力条件を表示)
                If IsNothing(Session("seBunruiCD")) = False Then
                    DropDownList2.SelectedValue = Left(Session("seBunruiCD"), 2)

     

                    SqlDataSource3.SelectParameters.Clear()
                    SqlDataSource3.SelectParameters.Add("分類CD", TypeCode.String, Left(Session("seBunruiCD"), 2))
                    SqlDataSource3.SelectCommand = "SELECT 分類CD, LEFT (分類CD, 3) AS 分類CD13, RIGHT (LEFT (分類CD, 3), 1) AS 分類CD3, 中分類 FROM M_Bunrui WHERE (分類CD LIKE @分類CD + '%' + '0')"
                    DropDownList3.DataSourceID = "SqlDataSource3"
                    DropDownList3.DataValueField = "分類CD13"
                    DropDownList3.DataTextField = "中分類"
                    DropDownList3.DataBind()


                    SqlDataSource3.SelectParameters.Clear()

                    SqlDataSource3.SelectParameters.Add("分類CD", TypeCode.String, DropDownList2.SelectedValue)
                    SqlDataSource3.SelectCommand = "SELECT 分類CD, LEFT (分類CD, 3) AS 分類CD13, RIGHT (LEFT (分類CD, 3), 1) AS 分類CD3, 中分類 FROM M_Bunrui WHERE (分類CD LIKE @分類CD + '%' + '0')"
                    DropDownList3.DataSourceID = "SqlDataSource3"
                    DropDownList3.DataValueField = "分類CD13"
                    DropDownList3.DataTextField = "中分類"
                    DropDownList3.DataBind()


                    DropDownList3.SelectedValue = Left(Session("seBunruiCD"), 3)

     

                    SqlDataSource4.SelectParameters.Clear()
                    SqlDataSource4.SelectParameters.Add("P分類CD13", TypeCode.String, Session("seBunruiCD"))
                    SqlDataSource4.SelectCommand = "SELECT 分類CD, 小分類 FROM M_Bunrui WHERE (分類CD LIKE @P分類CD13 + '%')"
                    DropDownList4.DataSourceID = "SqlDataSource4"
                    DropDownList4.DataValueField = "分類CD"
                    DropDownList4.DataTextField = "小分類"
                    DropDownList4.DataBind()
                    SqlDataSource4.SelectParameters.Clear()

                    SqlDataSource4.SelectParameters.Add("P分類CD13", TypeCode.String, DropDownList3.SelectedValue)
                    SqlDataSource4.SelectCommand = "SELECT 分類CD, 小分類 FROM M_Bunrui WHERE (分類CD LIKE @P分類CD13 + '%')"
                    DropDownList4.DataSourceID = "SqlDataSource4"
                    DropDownList4.DataValueField = "分類CD"
                    DropDownList4.DataTextField = "小分類"


                    DropDownList4.SelectedValue = Session("seBunruiCD")
                End If
            End If
        End Sub

     

     

        Protected Sub DropDownList2_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs)
            DropDownList3.DataBind()

            If IsNothing(Session("seBSyubetsu")) = False Then
                SqlDataSource3.SelectParameters.Clear()
                SqlDataSource3.SelectParameters.Add("分類CD", TypeCode.String, DropDownList2.SelectedValue)
                SqlDataSource3.SelectCommand = "SELECT 分類CD, LEFT (分類CD, 3) AS 分類CD13, RIGHT (LEFT (分類CD, 3), 1) AS 分類CD3, 中分類 FROM M_Bunrui WHERE (分類CD LIKE @分類CD + '%' + '0')"

                SqlDataSource4.SelectParameters.Clear()
                SqlDataSource4.SelectParameters.Add("P分類CD13", TypeCode.String, DropDownList3.SelectedValue)
                SqlDataSource4.SelectCommand = "SELECT 分類CD, 小分類 FROM M_Bunrui WHERE (分類CD LIKE @P分類CD13 + '%')"
                DropDownList3.SelectedIndex = 0       '分類2
                DropDownList4.SelectedIndex = 0       '分類3
            End If

        End Sub

     

     

        Protected Sub DropDownList3_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs)
            DropDownList4.DataBind()

            If IsNothing(Session("seBSyubetsu")) = False Then
                SqlDataSource4.SelectParameters.Clear()
                SqlDataSource4.SelectParameters.Add("P分類CD13", TypeCode.String, DropDownList3.SelectedValue)
                SqlDataSource4.SelectCommand = "SELECT 分類CD, 小分類 FROM M_Bunrui WHERE (分類CD LIKE @P分類
    CD13 + '%')"
            End If

        End Sub

     

     

    2007年10月19日 6:39
  • あ、むしろデータをセットするタイミングの問題かな。

     

            If Not IsPostBack Then
                'セッションが残っていた場合(前画面から戻った場合、入力条件を表示)
                If IsNothing(Session("seBunruiCD")) = False Then
                    DropDownList2.SelectedValue = Left(Session("seBunruiCD"), 2)
                    DropDownList3.SelectedValue = Left(Session("seBunruiCD"), 3)
                    DropDownList4.SelectedValue = Session("seBunruiCD")
                End If
            End If

    この部分をPage_Loadで行わず、Page_PreRenderCompleteの中で実行したらどうなります?

     

    #データのバインディングはPage_PreRenderイベントとPage_PreRenderCompleteイベントの間に行われます。

    2007年10月19日 7:05
  • どっとねっとふぁん様

    お世話になります。

    Page_PreRenderCompleteイベントが一覧に無かった?(ヘルプはあるのに)ので、Page_PreRenderイベントに以下のように記述したところ、データソースやDropDownListを再設定することなく短いコードで思い通りの動きをしてくれました。

    長々としたコードも不要になり、すっきりしました。

    ありがとうございました。

     

    コード ブロック

        Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs)
            If Not IsPostBack Then
                If IsNothing(Session("seBSyubetsu")) = False Then     'セッションが残っていた場合(前画面から戻った場合、入力条件を表示)
                    DropDownList2.SelectedValue = Left(Session("seBunruiCD"), 2)
                    DropDownList2.DataBind()
                    DropDownList3.SelectedValue = Left(Session("seBunruiCD"), 3)
                    DropDownList3.DataBind()
                    DropDownList4.SelectedValue = Session("seBunruiCD").ToString
                    DropDownList4.DataBind()
                End If
            End If
        End Sub

     

    2007年10月19日 8:35