- - PR -
GRIDVIEW内のCheckboxの値をうまく参照できない
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-08-21 17:55
いつもお世話になっております。
現在Gridviewの中にTemplatefieldとしてCheckboxとHtmlInputButtonがあります。 データを変更したい行のHtmlInputButtonを押すと子画面が開き その子画面のGridviewから希望するデータを選択すると 元の親画面にデータが反映され、行のCheckboxにチェックが入るよう Javascriptを組んでいます(子画面に実装しています)。 子画面からデータを反映させると、CheckboxにCheckが入るのですが Gridviewの全ての行を検索(Forで)し、CheckBoxにチェックが入っているか 確認すると、チェックが入っている一番最初の行のみ認識し それ以降の行についてはチェックが入っていることを認識しません。 (If DirectCast(GridView1.Rows(count).FindControl("CheckBox2"), CheckBox).Checked = True Thenでtrueにならない) 変更があった行に対しては更新クエリをかけるため チェックが入っているかどうかを知る必要があります。 Javascriptで入れた値は取得することができないのでしょうか。 どなたか教えていただけると幸いです。 どうぞよろしくお願いいたします。 | ||||||||||||
|
投稿日時: 2007-08-21 21:04
私はGridView内の各行に配置したCheckBoxコントロールを全て選択したり、選択を解除するためなどによくjavascriptを用いていますが、javascriptでチェックした値もサーバー側で取得できています。
クライアント側でチェックされているならば、サーバー側の処理がまずいのだと考えられます。 ポストバックの度にGridViewのデータが初期化されていないか確認してください。 ボタンコントロールなどを押して、サーバーにPostBackした場合は、 ボタンコントロールに関連付けられているイベントハンドラの他に Page_Loadイベントもはしります。 Page_Loadイベント内でPage.IsPostBackプロパティの値を調べずに GridViewの初期化が行われていませんか? | ||||||||||||
|
投稿日時: 2007-08-22 08:24
お返事ありがとうございます。
Postbackをなるべく起こさないように、配置したボタンは GridViewのRowDataBoundにて以下のようなJavascriptを付けています。 var width = 500; var height = 500; var X; var Y; if ( event.screenY + height > screen.height ) Y = event.screenY - height; else Y = event.screenY; if ( event.screenX + width > screen.width) X = screen.width - width; else X = event.screenX; var features = 'height=' + height + ',width= ' + width + ',top=' + Y + ',left=' + X + ',dependent=yes, location=no,menubar=no,resizable=yes,scrollbars=yes, status=no,titlebar=no,toolbar=no'; ccc = window.open('ko_gamen.aspx?p1=oya_gamen.aspx&p2=sel_btn.ClientID','kodomo',features); ccc.moveTo(X,Y);ccc.focus();") 子画面(ko_gamen.aspx)からの戻りは 子画面のGridViewのSelectedIndexChangedにてハンドリングし <script language=javascript> window.opener.form1.gridview_ID.control_no.control_ID.value=xxx; のようなJavascriptを発生させて値を戻しています。 そのためボタンを押したとき及び子画面から戻ってきた際には Postbackは発生しません。 この子画面からはチェックボックスだけでなく 同じ行のテキストボックスにも同様に値を貼り付けているのですが イベントを調べてみたらなぜかこのテキストボックスのTextChangedイベントが 一度だけ発生します。 発生するのは更新があった(チェックが入っている)一番最初の行のみです。 | ||||||||||||
|
投稿日時: 2007-08-22 08:56
子画面が開いて閉じられるまでポストバックは発生しないのですよね。
なら、まず子画面を使わずに、単にjavascriptでチェックするだけにして試してみたらいかがですか? あと「Gridviewの全ての行を検索」をどのイベントでやっているのかが気になります。 | ||||||||||||
|
投稿日時: 2007-08-22 09:27
ご回答ありがとうございます。
そうですね。同画面のJavascriptとかチェックして値が取れるかどうか確認してみます。
これはボタンを一つ用意していて(更新ボタンです)、 これを押したときにGridviewの全行を検索しています。 | ||||||||||||
|
投稿日時: 2007-08-22 11:25
>べる様、sou様
いろいろ教えていただき、ありがとうございました。 実はやはりPostbackが発生しておりました。 JavascriptでCheckboxにチェックを入れいているときには 発生しないのですが、「更新」ボタンを押したときに Postbackが発生し、Javascriptにて入れたチェックが 消えていたようです。 そこでPageイベントのPreloadにて、データをSessionに格納し その後の処理のデータに使用することで問題は解消されました。 私の早とちりでした。すみませんでした。 今後もお世話になるかもしれませんが、そのときには どうぞよろしくお願いいたします。 ありがとうございました。 | ||||||||||||
|
投稿日時: 2007-08-22 11:51
更新ボタンを押したときにサーバーにポストバックするのは、
当たり前の処理なんですが・・ 私が言いたいのは、ポストバックのたびにPage.Loadイベント内などで GridViewの再作成が行われていないですか?ということです。 チェックされている値を取得するのに PreloadやSessionやらを使用する必要は無いように思うのですが・・。
[ メッセージ編集済み 編集者: sou 編集日時 2007-08-22 12:00 ] | ||||||||||||
|
投稿日時: 2007-08-22 13:03
お返事いただき、ありがとうございます。
Postback時にはGridviewの再作成は行っておりません。 試しに何もしないボタンを一つ作り Javascriptでチェックを入れてからそのボタンを押したところ チェックボックスの値あ初期化(空)になりました。 これが原因じゃないかと思ってたのですが。
VBですが、同じようなコードを書いています。 |