質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

1回答

1757閲覧

ASP.NETのGridViewでonClientClick

zip

総合スコア21

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2020/02/18 04:12

編集2020/02/18 07:53

ASP.NETのGridViewのAllowSortingオプションをtrueにすると、SortExpressionを設定したカラムのヘッダは一覧をソートするためのリンクになります
このとき、このリンクにOnClientClickイベントを設定する方法を教えてください

追記
環境
.Net Framework 4.6
Visual Studio Express 2015 for web

やりたいこと
・画面を閉じるときに実施したい処理AをonUnloadに記述している
・このままだと、閉じるときだけじゃなくポストバックが走るたびに実行されるので「画面が閉じないポストバックを走らせる」ボタンなどを押したときに「閉じるフラグ」を"0"にする処理を行う(本来であれば閉じる処理のときに閉じるフラグを"1"にする方がスマートだが、ブラウザの×ボタン押下を検知できないのでこうしている)
・onUnloadイベント内で閉じるフラグを参照し、"0"になっていない場合のみ処理Aを行う
・GridViewヘッダ押下以外のボタンなどには上記の処理を追加済してあり、意図通り動くことを確認済み

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/02/18 05:57

GridView ということはクラシック ASP ではなくて ASP.NET ですよね。ASP ではなくて ASP.NET のタグに付け直してください。 開発環境(特に ASP.NET と Visual Studio のバージョン)を書いてください。 OnClientClick に JavaScript を設定してポストバックする前に何かしたいのだと理解していますが、具体的に何をしたいのかを書いてください。もし XY 問題になっているとすると、Y に答えても本来やりたいこと X の解決にならないので聞いてます。
退会済みユーザー

退会済みユーザー

2020/02/18 07:24

お手数ですが表題と質問の一番最初の行を「ASP.NET の GridView ...」に直していただきたく。
guest

回答1

0

ベストアンサー

ポストバックが走るたびに実行されるので「画面が閉じないポストバックを走らせる」ボタンなどを押したときに「閉じるフラグ」を"0"にする処理を行う

とすると、もしヘッダのリンクボタンの他にもポストバックするもの(ページングとか選択・編集・削除とかのボタン)があればそれらにも OnClientClick を設定しなければならないという面倒なことになるのですが、それはどうするのですか?

そのようなものはなくてヘッダのリンクボタンだけだったとしても、それがいくつあるのか分かりませんが、RowCreated イベントあたりでヘッダのリンクボタン全てを探して OnClientClick を設定しなければならないというのは面倒です。

代わりに form 要素の onsubmit 属性にフラグを 0 にするスクリプトを設定してはいかがですか?

どのようにするかの具体例ですが、まず Page_Load あたりで ClientScriptManager.RegisterOnSubmitStatement メソッドを使って以下のようにします。

protected void Page_Load(object sender, EventArgs e) { string csname = "OnSubmitScript"; Type cstype = this.GetType(); ClientScriptManager cs = Page.ClientScript; if (!cs.IsOnSubmitStatementRegistered(cstype, csname)) { string cstext = "SetFlag();"; cs.RegisterOnSubmitStatement(cstype, csname, cstext); } }

そうすると html ソースでは form 要素の onsubmit 属性に以下のスクリプトが設定されます。

<form method="post" onsubmit="javascript:return WebForm_OnSubmit();" ...>

加えて、以下のスクリプトがインラインで配置されます。

<script type="text/javascript"> //<![CDATA[ function WebForm_OnSubmit() { SetFlag(); return true; } //]]> </script>

なので、SetFlag() メソッドでフラグを 0 にすれば望むことができそうな気がします。お試しください。

もし期待通りにならなかった場合は、どこがどのように期待と異なるか書いてください。

投稿2020/02/18 07:29

編集2020/02/18 07:38
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zip

2020/02/18 08:35

完全に期待通りの結果を得ることができました。ありがとうございます。 一つ、私の理解のために質問させてください。 対象の画面には複数の「画面が閉じないボタン」と1つだけ画面が閉じるボタン(キャンセルボタン)、それとブラウザの×ボタンがありましたが、狙い通りに×ボタンとキャンセルボタンを押下した時のみ、望みの処理を実施できました。 私の感覚ですと、×ボタンはまだしもキャンセルボタンを押した場合も他のボタンなどと同様にOnSubmit処理が動作すると思っていたのですが、それは内部的にはどのように区別されているのでしょうか…
退会済みユーザー

退会済みユーザー

2020/02/18 09:11 編集

> 私の感覚ですと、×ボタンはまだしもキャンセルボタンを押した場合も他のボタンなどと同様にOnSubmit処理が動作すると思っていたのですが、それは内部的にはどのように区別されているのでしょうか… 質問者さんの言われる「キャンセルボタン」というのが何か分かりませんが、要するに ASP.NET Web Forms アプリの場合は「ポストバック」=「form を submit」ですので、ボタンに form を submit する機能があるか否かが onsubmit 属性に設定したスクリプトが動くか否かということになります。 例えば Button コントロールは html に変換されると input type="submit" になるのでクリックすれば form が submit(ポストバック)されます。LinkButton は a 要素になりますが href 属性に設定されるスクリプト "javascript:__doPostBack(&#39;LinkButton1&#39;,&#39;&#39;)" によって form が submit されます。なので、form 要素の onsubmit 属性に設定されたスクリプトが動きます。 一方、confirm のキャンセルボタンなどは、それをクリックしても form は submit(ポストバック)されないので、form 要素の onsubmit 属性に設定されたスクリプトは動きません。
zip

2020/02/18 09:39

回答ありがとうございます 最終的には教えていただいた上記の処理で問題ないことが確認できました キャンセルボタンも他のボタンと同様にsubmitしていましたが、その後「ポストバック→ウィンドウを閉じるクライアント処理を呼び出す処理がサーバで実行→クライアント側に戻ってきてウィンドウを閉じる」という流れになっていることがわかりました。(このあたりはフレームワーク内の処理で、詳細に把握できていませんでした。) したがって、改めてクライアント側に戻ってきた際には「閉じるフラグ」が"1"に初期化されているため望み通りの動作になっていました。 といった具合で、問題は解決できました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問