- PR -

GridViewのボタンにOnClientClickイベントを追加したのですが、ポストされてしまいます

1
投稿者投稿内容
由加
常連さん
会議室デビュー日: 2008/04/02
投稿数: 34
投稿日時: 2008-04-15 20:32
こんばんは。
ASP.NETのGridViewで、
RowDataBoundイベントの際に、
コード:
string strFunc;
strFunc = "Push(" + e.Row.RowIndex.ToString() + ");";
((Button)e.Row.FindControl("btnDetail")).Attributes.Add("OnClientClick", strFunc);


で、クライアントのスクリプトが走るようにしようとしたのですが、
サーバにポストされてしまい、無効なポストバックとしてエラーとなってしまいます。
((Button)e.Row.FindControl("btnDetail")).OnClientClick = strFunc;
とやっても同じ結果になります。
ブラウザのコードを表示すると、OnClientClickと書かれているのですが・・・。
どなたか、ご教授お願いします。



ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2008-04-15 20:44
引用:

由加さんの書き込み (2008-04-15 20:32) より:

こんばんは。
ASP.NETのGridViewで、
RowDataBoundイベントの際に、
コード:
string strFunc;
strFunc = "Push(" + e.Row.RowIndex.ToString() + ");";
((Button)e.Row.FindControl("btnDetail")).Attributes.Add("OnClientClick", strFunc);


で、クライアントのスクリプトが走るようにしようとしたのですが、
サーバにポストされてしまい、無効なポストバックとしてエラーとなってしまいます。
((Button)e.Row.FindControl("btnDetail")).OnClientClick = strFunc;
とやっても同じ結果になります。
ブラウザのコードを表示すると、OnClientClickと書かれているのですが・・・。
どなたか、ご教授お願いします。


HTML の Button に "OnClientClick" という属性がないからだと思います。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
由加
常連さん
会議室デビュー日: 2008/04/02
投稿数: 34
投稿日時: 2008-04-15 21:06
ご返信ありがとうございます。
試しに、
HTMLのINPUTタグを入れて、
e.Row.Cells[3].Attributes.Add("OnClick", strFunc);
としたら、<TD>タグに追加されてしまいました。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2008-04-15 21:38
引用:
((Button)e.Row.FindControl("btnDetail")).OnClientClick = strFunc;
とやっても同じ結果になります。

「同じ」ではないはずです。
((Button)e.Row.FindControl("btnDetail")).OnClientClick="alert('test');";
で試してみてください。当方ではメッセージが表示されました。
ただ、ポストはされますよ。html上ではsubmitボタンですから。
alert('test');return false;
とかしないと。

引用:
e.Row.Cells[3].Attributes.Add("OnClick", strFunc);
としたら、<TD>タグに追加されてしまいました

それはそうです。e.Row.Cells[3]はhtml上でのtdですから。その配下にButtonがあるのです。
由加
常連さん
会議室デビュー日: 2008/04/02
投稿数: 34
投稿日時: 2008-04-15 21:49
ありがとうございます。
コード:
;return false;


が鍵になって、期待していた動きになりました。
GridViewでポストされないボタン(行によって異なる引数を持つ)を作りたくて、
あれこれやっていたのですが。
ぽぴ王子さんなどのコメントにもあるように、
OnClientClickは、HTMLに無い属性で、
上手く表現できないのですが、ASP.NETで便宜上あるような印象を持ちました。
コード:
((Button)e.Row.FindControl("btnDetail")).OnClientClick="alert('test');"; 


と記述すると、HTMLではOnClickになってしまいますし。

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

Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2008-04-16 06:20
ボタンには、Input (Button)とInput (Submit)の2種類あります。

JavaScriptを起動させたいだけなら
Buttonコントールを使用したらどうでしょうか。

コード:
<input id="Button1" runat="server" type="button" 
       value="button" onclick="myfunc();" />

<input id="Submit1" runat="server" type="submit" 
       value="submit" onclick="myfunc(); return false;" />




_________________
ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-04-16 10:12
GridView の ButtonField で追加したボタンを押すとポストバックがかかるのは、ボタンが Input(Submit) だからではなく、Input(Button) の onclick 属性に __doPostBack() という JavaScript が入っているからです。
# そうなっている理由は、ButtonField が Link や Image の場合でも動作するためだと思います。

ですので、ポストバックさせないようにするには、

・return false; を含んだ JavaScript を onclick 属性に追加する
# 方法は既に挙がっている通りです。
# __doPostBack() 呼び出しの手前に追加されるので、__doPostBack() が動作しなくなります。

・TemplateField 列に Input(Button) を追加したものを代わりに使う
# __doPostBack() のないキレイなボタンができあがります。

のどちらかの方法になると思います。
由加
常連さん
会議室デビュー日: 2008/04/02
投稿数: 34
投稿日時: 2008-04-16 10:25
ありがとうございます。
ポストバックをさせないことを考えると、return false;するより、
<INPUT type="button">の方が、目的がはっきりして、気分的にもすっきりしますね。
こちらに変更します。
ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)