none
GridViewのHyperLinkFieldでPostBackを発生させたい。 RRS feed

  • 質問

  • 2画面を行き来するWebアプリケーションで
    画面1から画面2に遷移する際に、画面1の内容をSessionで保持するために
    PostBackを発生させたいのですが、現在では良い手が浮かびません。

    JavaScriptでPostbackするしかないのでしょうか?

    ①画面遷移にはGridViewのHyperLinkFieldを使用しています。
     (現状、仕様のためLinkButtonなどに変更することは無理です)
    2009年8月21日 2:08

回答

  • そもそもの仕様に問題があるんでしょうね。
    フレームワーク/コントロールを使った開発では、仕様を考える時点で何ができて何ができないのかきちんと理解している必要があります。

    と言っててもしょうがないので。
    受け渡す情報が少ないのであればクエリ文字列にその情報を組み込んで渡すこともできると思いますが、それではだめかな。
    あおい情報システム株式会社 小野修司(どっとねっとふぁん)
    2009年8月21日 3:59
  • 2画面を行き来するWebアプリケーションで
    画面1から画面2に遷移する際に、画面1の内容をSessionで保持するために
    PostBackを発生させたいのですが、現在では良い手が浮かびません。

    JavaScriptでPostbackするしかないのでしょうか?

    ①画面遷移にはGridViewのHyperLinkFieldを使用しています。
     (現状、仕様のためLinkButtonなどに変更することは無理です)


    単に PostBack するだけではなく、LinkButton でできること(画面1のボタンクリックで PostBack し、Click イ
    ベントのハンドラで Session データを設定した後 HttpResponse.Redirect メソッドで画面2に遷移する)と同様
    なことを、HyperLinkField で実現したいということですよね?

    でも、HyperLink をクリックしても PostBack しないし、イベントも発生しないから悩んでいるということだと理
    解しています。

    そうであれば、LinkButton と HyperLink の差(JavaScript, HiddenField など)を自力で実装するしか手はな
    いと思います。

    言葉ではうまく説明するのが難しいので、あまりスマートとはいえないコードで示しますが、以下のような感じ。

    <%@ Page Language="C#" %>
    <%@ Import Namespace="System.Data" %>

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

    <script runat="server">
        DataTable CreateDataTable()
        {
            DataTable dt = new DataTable();
            DataRow dr;

            dt.Columns.Add(new DataColumn("Code", typeof(Int32)));
            dt.Columns.Add(new DataColumn("Name", typeof(string)));
            dt.Columns.Add(new DataColumn("Price", typeof(Int32)));

            for (int i = 0; i < 10; i++)
            {
                dr = dt.NewRow();
                dr["Code"] = i;
                dr["Name"] = "Item " + i.ToString();
                dr["Price"] = 123000 * (i + 1);
                dt.Rows.Add(dr);
            }
            return dt;
        }

        void Page_Load(Object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                GridView1.DataSource = CreateDataTable();
                GridView1.DataBind();
            }
            else
            {
                if (HiddenField1.Value == "HyperLinkClicked")
                {
                    Session["Page-1_Data"] = "hogehoge";
                    Response.Redirect("~/Default.aspx");
                }
            }
        }

        protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                foreach (Control control in e.Row.Cells[0].Controls)
                {
                    if (control is HyperLink)
                    {
                        ((HyperLink)control).NavigateUrl = "javascript:PostBack();";
                    }
                }
            }
        }

    </script>

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>

    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:GridView ID="GridView1" runat="server"
                OnRowDataBound="GridView1_RowDataBound">
                <Columns>
                    <asp:HyperLinkField HeaderText="HyperLink" DataTextField="Name" />
                </Columns>
            </asp:GridView>
        </div>
        <input type="hidden" name="HiddenField1" id="HiddenField1" value="" runat="server" />   
        </form>
    </body>
    </html>
    <script type="text/javascript">
    <!--
        var theForm = document.forms['form1'];
        if (!theForm) {
            theForm = document.form1;
        }
        function PostBack() {
            if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
                theForm.HiddenField1.value = 'HyperLinkClicked';
                theForm.submit();
            }
        }
    //-->
    </script>

    2009年8月22日 1:20

すべての返信

  • そもそもの仕様に問題があるんでしょうね。
    フレームワーク/コントロールを使った開発では、仕様を考える時点で何ができて何ができないのかきちんと理解している必要があります。

    と言っててもしょうがないので。
    受け渡す情報が少ないのであればクエリ文字列にその情報を組み込んで渡すこともできると思いますが、それではだめかな。
    あおい情報システム株式会社 小野修司(どっとねっとふぁん)
    2009年8月21日 3:59
  • 2画面を行き来するWebアプリケーションで
    画面1から画面2に遷移する際に、画面1の内容をSessionで保持するために
    PostBackを発生させたいのですが、現在では良い手が浮かびません。

    JavaScriptでPostbackするしかないのでしょうか?

    ①画面遷移にはGridViewのHyperLinkFieldを使用しています。
     (現状、仕様のためLinkButtonなどに変更することは無理です)


    単に PostBack するだけではなく、LinkButton でできること(画面1のボタンクリックで PostBack し、Click イ
    ベントのハンドラで Session データを設定した後 HttpResponse.Redirect メソッドで画面2に遷移する)と同様
    なことを、HyperLinkField で実現したいということですよね?

    でも、HyperLink をクリックしても PostBack しないし、イベントも発生しないから悩んでいるということだと理
    解しています。

    そうであれば、LinkButton と HyperLink の差(JavaScript, HiddenField など)を自力で実装するしか手はな
    いと思います。

    言葉ではうまく説明するのが難しいので、あまりスマートとはいえないコードで示しますが、以下のような感じ。

    <%@ Page Language="C#" %>
    <%@ Import Namespace="System.Data" %>

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

    <script runat="server">
        DataTable CreateDataTable()
        {
            DataTable dt = new DataTable();
            DataRow dr;

            dt.Columns.Add(new DataColumn("Code", typeof(Int32)));
            dt.Columns.Add(new DataColumn("Name", typeof(string)));
            dt.Columns.Add(new DataColumn("Price", typeof(Int32)));

            for (int i = 0; i < 10; i++)
            {
                dr = dt.NewRow();
                dr["Code"] = i;
                dr["Name"] = "Item " + i.ToString();
                dr["Price"] = 123000 * (i + 1);
                dt.Rows.Add(dr);
            }
            return dt;
        }

        void Page_Load(Object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                GridView1.DataSource = CreateDataTable();
                GridView1.DataBind();
            }
            else
            {
                if (HiddenField1.Value == "HyperLinkClicked")
                {
                    Session["Page-1_Data"] = "hogehoge";
                    Response.Redirect("~/Default.aspx");
                }
            }
        }

        protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                foreach (Control control in e.Row.Cells[0].Controls)
                {
                    if (control is HyperLink)
                    {
                        ((HyperLink)control).NavigateUrl = "javascript:PostBack();";
                    }
                }
            }
        }

    </script>

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>

    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:GridView ID="GridView1" runat="server"
                OnRowDataBound="GridView1_RowDataBound">
                <Columns>
                    <asp:HyperLinkField HeaderText="HyperLink" DataTextField="Name" />
                </Columns>
            </asp:GridView>
        </div>
        <input type="hidden" name="HiddenField1" id="HiddenField1" value="" runat="server" />   
        </form>
    </body>
    </html>
    <script type="text/javascript">
    <!--
        var theForm = document.forms['form1'];
        if (!theForm) {
            theForm = document.form1;
        }
        function PostBack() {
            if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
                theForm.HiddenField1.value = 'HyperLinkClicked';
                theForm.submit();
            }
        }
    //-->
    </script>

    2009年8月22日 1:20
  • こんにちは、フォーラムオペレーターの高橋春樹です。

    小野@どっとねっとふぁんさん、アドバイスありがとうございました。

    SurferOnWwwさん、サンプルコードの投稿をして頂き、有難うございました。
    分かりやすく皆様の参考となるので、大変助かります。

    Sayakaさん、初めまして。MSDNフォーラムのご利用ありがとうございます。
    小野@どっとねっとふぁんさと、SurferOnWwwさんからアドバイスを頂いたと思うのですが、試して頂けましたでしょうか?
    今の状況を詳しくお伝えして頂けると、新たな情報が得られるかもしれません。
    今回、小野@どっとねっとふぁんさんと、SurferOnWwwさんからの投稿が、有用な情報と思いましたので、
    勝手ながら、皆様の投稿に、回答マークを付けさせてもらいました。
    回答マークは、スレッドの終了を意味するものではないので、問題が解決していないときは、
    新たに投稿して頂きたいと思います。

    今後ともMSDNフォーラムをよろしくお願いします(^-^)


    マイクロソフト株式会社 フォーラム オペレーター 高橋春樹
    2009年9月1日 6:05