- PR -

GRIDVIEW内のCheckboxの値をうまく参照できない

投稿者投稿内容
ぷう
会議室デビュー日: 2006/03/15
投稿数: 12
投稿日時: 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で入れた値は取得することができないのでしょうか。
どなたか教えていただけると幸いです。

どうぞよろしくお願いいたします。
sou
ベテラン
会議室デビュー日: 2002/09/25
投稿数: 56
投稿日時: 2007-08-21 21:04
私はGridView内の各行に配置したCheckBoxコントロールを全て選択したり、選択を解除するためなどによくjavascriptを用いていますが、javascriptでチェックした値もサーバー側で取得できています。

クライアント側でチェックされているならば、サーバー側の処理がまずいのだと考えられます。

ポストバックの度にGridViewのデータが初期化されていないか確認してください。

ボタンコントロールなどを押して、サーバーにPostBackした場合は、
ボタンコントロールに関連付けられているイベントハンドラの他に
Page_Loadイベントもはしります。

Page_Loadイベント内でPage.IsPostBackプロパティの値を調べずに
GridViewの初期化が行われていませんか?
ぷう
会議室デビュー日: 2006/03/15
投稿数: 12
投稿日時: 2007-08-22 08:24
お返事ありがとうございます。

引用:

souさんの書き込み (2007-08-21 21:04) より:
私はGridView内の各行に配置したCheckBoxコントロールを全て選択したり、選択を解除するためなどによくjavascriptを用いていますが、javascriptでチェックした値もサーバー側で取得できています。

クライアント側でチェックされているならば、サーバー側の処理がまずいのだと考えられます。

ポストバックの度にGridViewのデータが初期化されていないか確認してください。

Page_Loadイベント内でPage.IsPostBackプロパティの値を調べずに
GridViewの初期化が行われていませんか?




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イベントが
一度だけ発生します。
発生するのは更新があった(チェックが入っている)一番最初の行のみです。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2007-08-22 08:56
子画面が開いて閉じられるまでポストバックは発生しないのですよね。
なら、まず子画面を使わずに、単にjavascriptでチェックするだけにして試してみたらいかがですか?
あと「Gridviewの全ての行を検索」をどのイベントでやっているのかが気になります。
ぷう
会議室デビュー日: 2006/03/15
投稿数: 12
投稿日時: 2007-08-22 09:27
ご回答ありがとうございます。

引用:

べるさんの書き込み (2007-08-22 08:56) より:
子画面が開いて閉じられるまでポストバックは発生しないのですよね。
なら、まず子画面を使わずに、単にjavascriptでチェックするだけにして試してみたらいかがですか?



そうですね。同画面のJavascriptとかチェックして値が取れるかどうか確認してみます。

引用:

あと「Gridviewの全ての行を検索」をどのイベントでやっているのかが気になります。



これはボタンを一つ用意していて(更新ボタンです)、
これを押したときにGridviewの全行を検索しています。
ぷう
会議室デビュー日: 2006/03/15
投稿数: 12
投稿日時: 2007-08-22 11:25
>べる様、sou様

いろいろ教えていただき、ありがとうございました。

実はやはりPostbackが発生しておりました。

JavascriptでCheckboxにチェックを入れいているときには
発生しないのですが、「更新」ボタンを押したときに
Postbackが発生し、Javascriptにて入れたチェックが
消えていたようです。

そこでPageイベントのPreloadにて、データをSessionに格納し
その後の処理のデータに使用することで問題は解消されました。

私の早とちりでした。すみませんでした。

今後もお世話になるかもしれませんが、そのときには
どうぞよろしくお願いいたします。
ありがとうございました。
sou
ベテラン
会議室デビュー日: 2002/09/25
投稿数: 56
投稿日時: 2007-08-22 11:51
更新ボタンを押したときにサーバーにポストバックするのは、
当たり前の処理なんですが・・

私が言いたいのは、ポストバックのたびにPage.Loadイベント内などで
GridViewの再作成が行われていないですか?ということです。

チェックされている値を取得するのに
PreloadやSessionやらを使用する必要は無いように思うのですが・・。

コード:

proteted void Page_Load(object sender,EventArgs e)
{
//下のif文で条件分岐しない場合は、
//更新ボタン(UpdateButton)をクリックした場合も
//GridView1の作成が行われる。
//その結果、GridView内のCheckBoxコントロールの値も初期化される。
if(!this.IsPostBack)
{
this.GridView1.DataSource = Datasource;
this.GridView1.DataBind();
}
}

//更新ボタンクリック
proteted void UpdateButton_Click(object sender,EventArgs e)
{
//更新処理
}




[ メッセージ編集済み 編集者: sou 編集日時 2007-08-22 12:00 ]
ぷう
会議室デビュー日: 2006/03/15
投稿数: 12
投稿日時: 2007-08-22 13:03
お返事いただき、ありがとうございます。

引用:

souさんの書き込み (2007-08-22 11:51) より:
更新ボタンを押したときにサーバーにポストバックするのは、
当たり前の処理なんですが・・

私が言いたいのは、ポストバックのたびにPage.Loadイベント内などで
GridViewの再作成が行われていないですか?ということです。




Postback時にはGridviewの再作成は行っておりません。

試しに何もしないボタンを一つ作り
Javascriptでチェックを入れてからそのボタンを押したところ
チェックボックスの値あ初期化(空)になりました。
これが原因じゃないかと思ってたのですが。

引用:

コード:
proteted void Page_Load(object sender,EventArgs e)
{
   //下のif文で条件分岐しない場合は、
   //更新ボタン(UpdateButton)をクリックした場合も
   //GridView1の作成が行われる。
   //その結果、GridView内のCheckBoxコントロールの値も初期化される。
   if(!this.IsPostBack)
   {
       this.GridView1.DataSource = Datasource;
       this.GridView1.DataBind();
   }
}

//更新ボタンクリック
proteted void UpdateButton_Click(object sender,EventArgs e)
{
    //更新処理
}






VBですが、同じようなコードを書いています。

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