none
GridViewで選択した1レコードの詳細画面を別ページに表示させる RRS feed

  • 質問

  • いつも大変お世話になっております。
    visual web developer 2010 Expressを使用しています。
    下記質問と全く同じ事がやりたいのですが
    http://social.msdn.microsoft.com/forums/ja-jp/vwdexpressja/thread/B4CF1D76-5B09-49BD-B5ED-556BEB76D0D2
    うまくできません。

    回答のなかの
    >2、Default2.aspxに配置したAccessDataSource2を選択すると
    >出てくる右上の三角ボタンをクリックし[データソースの構成]を選択すると、
    >[データソースの構成]ダイアログが出てくると思います。
    >そのダイアログを進んでいくと
    >[パラメータの定義]という画面が出てくると思いますが、
    >その画面のパラメータソースでSessionまたはQueryStringを選択してやり、
    >その下のFieldにPubIDと指定してあげれば良いはずです。

    [データソースの構成]ダイアログを進んでも
    [パラメータの定義]という画面が出てきません。

    よく意味が分からないままに似たような画面があったことを思い出して、
    Defaul2ページに配置した
    DetailsViewのSQLDatasourceのプロパティで
    「SelectQuery」を選択し、
    「コマンドおよびパラメーターのエディター」で
    「パラメーターの追加」をクリック
    「パラメーターソース」で「QueryString」を選択し
    「QuerySiringField」に「ID」と入力してみましたが
    全然だめでした。


    どうしたらいいのでしょうか?


    参考サイト等ありましたら教えてください!

    ちなみに私はAccessDataSourceではなくSQLDatasourceを使っているのですが
    そのせいでしょうか?

    2012年7月4日 0:45

回答

  • そのSqlDataSourceのSelect文はどのように書かれていますか? そのSelect文にパラメータが書かれていなければ、パラメータを定義する画面は開きません。
    例えば、select * from hoge where @hogeid = hogeid のようにパラメータが必要です。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク masunona 2012年7月9日 1:01
    2012年7月4日 1:35
    モデレータ
  • #すみません。手が触れて「回答としてマーク」をクリックしてしまったようです。回答してマークを外しておきました。

            <asp:SqlDataSource ID="SqlDataSource2" runat="server"
                ConnectionString="<%$ ConnectionStrings:envelopeConnectionString2 %>"
                OldValuesParameterFormatString="original_{0}"
                SelectCommand="SELECT * FROM [envelope] WHERE ([ID] = @ID)">
                <SelectParameters>
                    <asp:QueryStringParameter Name="ID" QueryStringField="ID" Type="Int32" />
                </SelectParameters>
            </asp:SqlDataSource>

    さて、このコードで問題ないはずです。私の方でそのコードを試してみましたが、パラメータ定義の画面が表示されました。
    デザイナからSqlDataSource2の右上にある「>」をクリックし、「データソースの構成...」で開始されるウィザードの途中でパラメータ定義の画面が表示されました。具体的に書くと、、「データソースの構成...」をクリックした後、以下のように遷移しました。
    1.データ接続の選択
    2.アプリケーション構成ファイルに接続文字列を保存 ← これは私の環境で初めての接続文字列なので出たのでしょう。
    3.カスタムステートメントまたはストアドプロシージャを定義します。
    4.パラメータの定義
    5.クエリのテスト
    6.完了

    masunonaさんのところでは、4.のパラメータの定義画面がスキップされるのでしょうか?


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク masunona 2012年7月9日 1:01
    2012年7月5日 7:04
    モデレータ

すべての返信

  • そのSqlDataSourceのSelect文はどのように書かれていますか? そのSelect文にパラメータが書かれていなければ、パラメータを定義する画面は開きません。
    例えば、select * from hoge where @hogeid = hogeid のようにパラメータが必要です。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク masunona 2012年7月9日 1:01
    2012年7月4日 1:35
    モデレータ
  • まずは、参照されていたページ(下記)の通り作ってください。それ
    をベースに、やりたいことを実現するにはどうするかを話さないと、
    話が通じないと思います。

    データベースの 1 レコードを詳しく表示する方法
    http://msdn.microsoft.com/ja-jp/library/cc719224

    なお、Access か SQL Server かの違いは、今回の問題とは関係ありま
    せん。

    2012年7月4日 13:49
  • trapemiya さま

    いつもありがとうございます!

    Default2.aspx(詳細画面ぺージ)に配置したdetailsviewの
    SqlDataSourceを以下のようにしてみました。

            <asp:SqlDataSource ID="SqlDataSource2" runat="server"
                ConnectionString="<%$ ConnectionStrings:envelopeConnectionString2 %>"
                OldValuesParameterFormatString="original_{0}"
                SelectCommand="SELECT * FROM [envelope] WHERE ([ID] = @ID)">
                <SelectParameters>
                    <asp:QueryStringParameter Name="ID" QueryStringField="ID" Type="Int32" />
                </SelectParameters>
            </asp:SqlDataSource>

    まだ何か足りないでしょうか・・・??

    よろしければ引き続きお願いいたします!


    2012年7月5日 6:19
  • #すみません。手が触れて「回答としてマーク」をクリックしてしまったようです。回答してマークを外しておきました。

            <asp:SqlDataSource ID="SqlDataSource2" runat="server"
                ConnectionString="<%$ ConnectionStrings:envelopeConnectionString2 %>"
                OldValuesParameterFormatString="original_{0}"
                SelectCommand="SELECT * FROM [envelope] WHERE ([ID] = @ID)">
                <SelectParameters>
                    <asp:QueryStringParameter Name="ID" QueryStringField="ID" Type="Int32" />
                </SelectParameters>
            </asp:SqlDataSource>

    さて、このコードで問題ないはずです。私の方でそのコードを試してみましたが、パラメータ定義の画面が表示されました。
    デザイナからSqlDataSource2の右上にある「>」をクリックし、「データソースの構成...」で開始されるウィザードの途中でパラメータ定義の画面が表示されました。具体的に書くと、、「データソースの構成...」をクリックした後、以下のように遷移しました。
    1.データ接続の選択
    2.アプリケーション構成ファイルに接続文字列を保存 ← これは私の環境で初めての接続文字列なので出たのでしょう。
    3.カスタムステートメントまたはストアドプロシージャを定義します。
    4.パラメータの定義
    5.クエリのテスト
    6.完了

    masunonaさんのところでは、4.のパラメータの定義画面がスキップされるのでしょうか?


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク masunona 2012年7月9日 1:01
    2012年7月5日 7:04
    モデレータ
  • trapemiya さま

    早速ありがとうございます!

    3.で「カスタムSQLステートメントまたはストアドプロシージャを指定する」
    を選択したところ、
    「パラメータの定義」画面が出たので

    >[パラメータの定義]という画面が出てくると思いますが、
    >その画面のパラメータソースでQueryStringを選択してやり、
    >その下のFieldにIDと指定してあげれば良いはずです。

    上記設定をしました。

    以前は
    「テーブルまたはビューから列を指定します」
    を選択していたので出なかったようです。

    その後、GridViewに以下のようにコードを書いてみたのですが
    うんともすんとも動きません。

        Protected Sub GridView1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles GridView1.SelectedIndexChanged
            Response.Redirect("Default2.aspx?ID=" & GridView1.SelectedValue)
        End Sub

    またお時間ありましたら教えてください。
    お願いいたします!

    2012年7月5日 8:22
  • > その後、GridViewに以下のようにコードを書いてみたのですが
    > うんともすんとも動きません。

    元のコードが分からないので、何故そのようになるのか分かりません。
    想像はできますが、想像で回答して、想像が違っていると混乱するだ
    けですし。

    だから、先のレスで以下のように提案したのですが、それはやる気な
    しですか?

    > まずは、参照されていたページ(下記)の通り作ってください。それ
    > をベースに、やりたいことを実現するにはどうするかを話さないと、
    > 話が通じないと思います。

    2012年7月8日 0:27
  • trapemiya さま
    SurferOnWww さま

    色々教えていただきありがとうございました!
    悩んだ結果、期限もせまってきてしまい、別の方法をとることにしました。

    結局、下記の方法で、
    新しいページにdetailsviewで詳細情報を表示させることにしました。

    もし、画面遷移するのではなく、Default.aspxを表示しつつDefault2.aspxを新規ウィンドウで表示するということであれば、 Default.aspxのGridVewの選択ボタンの代わりに自前で HyperLinkFieldを配置してあげて、そのプロパティを以下のように設定すると良いのかなと思います。
    DataNavigateUrlFieldsにID
    DataNavigateUrlFormatStringにDefault2.aspx?ID={0}
    Targetに_blank

    これだと簡単に一発でできたのに
    最初の方法だとどうしてちゃんとできないのかと
    すっきりしないままですが
    時間が出来たらまた最初の方法に挑戦したいと思います。

    このたびはおつきあいいただきありがとうございました!
    2012年7月9日 1:00
  • その後、GridViewに以下のようにコードを書いてみたのですが
    うんともすんとも動きません。

        Protected Sub GridView1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles GridView1.SelectedIndexChanged
            Response.Redirect("Default2.aspx?ID=" & GridView1.SelectedValue)
        End Sub

    すみません。大変遅くなりました。ごめんなさい。m(_ _)m
    確認ですが、aspxのGridViewには、onselectedindexchanged="GridView1_SelectedIndexChanged" という記述は書かれていますか?
    お忙しそうですので、時間ができてから取り組まれてかまいませんよ。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2012年7月9日 1:34
    モデレータ
  • > HyperLinkFieldを配置してあげて、そのプロパティを以下の
    > ように設定すると良いのかなと思います。

    ポストバックしてサーバー側で何か処置する必要はないようで
    すので、その方法がよいと思います。

    前のやり方(ポストバックしてSelectedIndexChanged イベント
    でリダイレクト)は、ブラウザとサーバーのやり取りが一往復
    余分にかかるという無駄があります。

    他には、DetailsView を ASP.NET AJAX Control Toolkit の
    ModalPopup で表示するという手もあります。この場合は、サン
    プルの通り GridView と DetailsView を同じページ内に実装し、
    DetailsView を Panel に入れて ModalPopup で表示/非表示を
    切り替えます。

    2012年7月10日 12:43
  • trapemiya さま

    引き続きのご回答ありがとうございます・・・!

    >OnSelectedIndexChanged="GridView1_SelectedIndexChanged"
    上記一文がなかったので自分なりに書き加えてみたのですが
    「コンパイルエラー」になってしましました。
    書いた場所が間違ってますか・・・?

    ちなみに(いまさらですが)全コードは以下のとおりです。

    ●Default.aspx(一覧表のページ)

    【GridView】一覧表(「選択」ボタンを表示させ、ID,add1,nameの5つのフィールドがあります
    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
        DataKeyNames="ID" DataSourceID="SqlDataSource1" OnSelectedIndexChanged="GridView1_SelectedIndexChanged">←★
        <Columns>
            <asp:CommandField ShowSelectButton="True" />
            <asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" 
                ReadOnly="True" SortExpression="ID" />
            <asp:BoundField DataField="add1" HeaderText="add1" SortExpression="add1" />
            <asp:BoundField DataField="name" HeaderText="name" SortExpression="name" />
        </Columns>
    </asp:GridView>

    【GridViewのデータソース】
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
        ConnectionString="<%$ ConnectionStrings:envelopeConnectionString %>" 
        SelectCommand="SELECT * FROM [envelope]">
    </asp:SqlDataSource>

    ●Default2.aspx(詳細情報のページ)

    【detailsview】詳細情報
    <asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False" 
        DataKeyNames="ID" DataSourceID="SqlDataSource1" >
        <Fields>
            <asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" 
                ReadOnly="True" SortExpression="ID" />
            <asp:BoundField DataField="add1" HeaderText="add1" SortExpression="add1" />
            <asp:BoundField DataField="name" HeaderText="name" SortExpression="name" />
        </Fields>
    </asp:DetailsView>

    【detailsviewのデータソース】
    <asp:SqlDataSource ID="SqlDataSource2" runat="server" 
                ConnectionString="<%$ ConnectionStrings:envelopeConnectionString2 %>" 
                OldValuesParameterFormatString="original_{0}" 
                SelectCommand="SELECT * FROM [envelope] WHERE ([ID] = @ID)">
                <SelectParameters>
                    <asp:QueryStringParameter Name="ID" QueryStringField="ID" Type="Int32" />
                </SelectParameters>
    </asp:SqlDataSource>

    ●Default.aspx.vb

        Protected Sub GridView1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles GridView1.SelectedIndexChanged
            Response.Redirect("Default2.aspx?ID=" & GridView1.SelectedValue)
        End Sub

    またお時間あるときにでも教えてください!


    2012年7月11日 3:07
  • SurferOnWww さま

    お返事ありがとうございます!

    前のやりかたができなくて選んだ現在の方法ですが
    こちらのほうが有効?と分かってホッとしました!

    ありがとうございました!
    2012年7月11日 3:09
  • > 「コンパイルエラー」になってしましました。

    どこでどのようなエラーが出たのか、エラーメッセージを含め
    て具体的に書いてください。

    別のスレッドでもお願いしましたが、どういう情報を提供すれ
    ば、回答者が状況を理解できて、的確な回答を迅速に得られる
    か、よく考えて質問してください。

    2012年7月11日 12:58