- PR -

Datagrid内のチェックボックスの状態の取得ができない

投稿者投稿内容
bibiru
会議室デビュー日: 2004/06/10
投稿数: 5
投稿日時: 2004-06-10 17:23
皆さんはじめまして。
よろしくお願いします。

VB.NET VisualStudio.NETでWEBアプリケーションを開発しています。

件名の通り、Datagrid内にテンプレートを配置し、そのItemTemplate内にCheckBoxを
配置しました。
チェックボックスの値はDatagrid外に配置したボタンのクリックで取得します。

件名:(WEBアプリ)DataGridの複数選択行の内容を次のページに受渡し
件名:Datagrid内のチェックボックスについて

を参考にして、ボタンのクリックイベントのsub内(メソッド?)に以下のコードを
記述して状態の確認をしていますが、チェックボックスの値をきちんと取得できません。

このコードのボタンはチェックボックスがチェックされていれば、チェックを
外す処理を行います。


コード----------------------------------------
'***********************************************
'* チェック項目クリア
'***********************************************
Private Sub B_Clear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles B_Clear.Click

Dim myDataGridItem As DataGridItem
Dim DmyChkbox As CheckBox

For Each myDataGridItem In DataGrid1.Items
DmyChkbox = myDataGridItem.FindControl("CheckBox1")
If DmyChkbox.Checked Then
DmyChkbox.Checked = False
   'debug用
Me.ErrMsg.Text = "find"
End If
Next

End Sub
コード----------------------------------------

DEBUG用にテキストボックスを配置して、ボタンをクリックするとチェックがONになっている
場合そこに"find"とメッセージをはかせるようにしていますが、チェックしてあっても一度も
出力されません。
checkbox1のデフォルト値が"false"となっていて、全てデフォルトのまま判断されている様な
印象を受けました。

どなたか原因が分かる方がいらっしゃいましたら、アドバイスお願いします。

[ メッセージ編集済み 編集者: bibiru 編集日時 2004-06-10 17:24 ]
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2004-06-10 17:52
引用:

bibiruさんの書き込み (2004-06-10 17:23) より:
DEBUG用にテキストボックスを配置して、ボタンをクリックするとチェックがONになっている
場合そこに"find"とメッセージをはかせるようにしていますが、チェックしてあっても一度も
出力されません。



VS.NETの便利な機能を使いましょう。
http://www.atmarkit.co.jp/fdotnet/aspandvs/aspandvs06/aspandvs06_02.html
bibiru
会議室デビュー日: 2004/06/10
投稿数: 5
投稿日時: 2004-06-10 18:28
早速のアドバイスありがとうございます。

 デバッグ方法を見て
  For Each myDataGridItem In DataGrid1.Items
 のところにブレークポイントを設定してみましたが、ぜんぜん止まりません。

 このエディタは色々と使い方が難しいですね。

教えていただいたページをよく読んで色々試してみたいと思います。
why_i
会議室デビュー日: 2004/04/21
投稿数: 2
投稿日時: 2004-06-11 09:56
こんにちは、はじめて投稿します。ちょうど今、同じことをしようとしていました。

DataGrid内のCheckBoxの状態はRequestから取得しないといけないようです。

Dim Cb As CheckBox
Dim Row As DataGridItem
Dim Cname, Str1, Str2 As String
For Each Row In DataGrid1.Items
Cb = CType(Row.FindControl("CheckBox1"), CheckBox)
Cname = Cb.UniqueID
If Request.Form(Cname) <> "" Then
Str1 = Row.Cells(1).Text
Str2 = Row.Cells(3).Text
ListBox1.Items.Add(Str1 & " " & Str2)
Cb.Checked = True
End If
Next

これで思い通りにうごきました。
Cb.Checked = True
を書いておかないと、ポストバックした後の画面で
チェックがはずれてしまいます。

これで正解かどうか、自信はないのですが…。
bibiru
会議室デビュー日: 2004/06/10
投稿数: 5
投稿日時: 2004-06-11 11:28
todo様

件名:ASP.NETのデバッグができない。

を参考にして、
 ・プロジェクトプロパティ ASP.NETデバッグをON
  デバッグに必ずIEを使用するをON
 ・IISのプロパティ スクリプトのデバッグをON
にしたところ、きちんとデバッグできるようになりました。


why_i様

ずばりこのままのソースで期待した動作を確認出来ました。
ボタンをクリックすると必ずページの更新(?)が掛かり、チェックボックスの値は
デフォルト値になってしまうと言う事だったのですね。
大変助かりました。
ありがとうございました。
まるく
大ベテラン
会議室デビュー日: 2004/01/09
投稿数: 181
投稿日時: 2004-06-11 14:37
引用:

bibiruさんの書き込み (2004-06-11 11:28) より:
ボタンをクリックすると必ずページの更新(?)が掛かり、チェックボックスの値は
デフォルト値になってしまうと言う事だったのですね。



チェックボックスの値がリセットされるのは、B_Clear_Clickイベントの前で、再度DataBindしているからではありませんか? ViewStateをOFFにしていなければ、最初に掲示されたソースで動くと思います。
いろいろな過去ログを参照すると、処理の順番など勉強になると思います(私もそれでずいぶん勉強させて頂きました)。
bibiru
会議室デビュー日: 2004/06/10
投稿数: 5
投稿日時: 2004-06-12 10:53
まるく様

> B_Clear_Clickイベントの前で、再度DataBindしているからではありませんか?

についてですが、ボタンをクリックした瞬間に「B_Clear_Clickイベント」が発生
ハンドルされたメソッドが処理されると認識しております。
その前にdatabindするような記述はしているつもりは無いのですが・・。

ViewStateの部分ですが、Trueに設定しておりましたがクリックすると
ページの更新(ポストバック?)が掛かった様にページがちらつきます。

だから、ボタンは必ずポストバックが発生するんだと思っておりました。

ここら辺の参考になるページがございましたらお教え下さい。
アドバイスありがとうございます。

----------------------------------------------------------------
書いた後に思ったのですが

> ボタンをクリックした瞬間に「B_Clear_Clickイベント」が発生
> ハンドルされたメソッドが処理されると認識しております。
> その前にdatabindするような記述はしているつもりは無いのですが・・。

はあくまでもサーバ側で処理される為、ページのリロード(ポストバック)が発生する。
「page_load」(スペル違ってるかもしれません)にてdatabindを記述していた場合
そのbindによってチェックボックスが初期化された

と言う事なのでしょうか?

[ メッセージ編集済み 編集者: bibiru 編集日時 2004-06-12 10:59 ]
まるく
大ベテラン
会議室デビュー日: 2004/01/09
投稿数: 181
投稿日時: 2004-06-14 19:54
引用:

bibiruさんの書き込み (2004-06-12 10:53) より:

「page_load」(スペル違ってるかもしれません)にてdatabindを記述していた場合
そのbindによってチェックボックスが初期化された

と言う事なのでしょうか?

[ メッセージ編集済み 編集者: bibiru 編集日時 2004-06-12 10:59 ]



こんばんは。そのとおりです。
Page_Init→Page_Load→ボタン押下など各種サーバコントロールのイベント(発生時)→Page_PreRender→Page_Unloadといった順番に毎回イベントが走ります(PostBackであろうとなかろうと)。ブレークポイントを張って実行してみてください。
ASP.NETの入門書にはだいたい書いてあると思います。


[ メッセージ編集済み 編集者: まるく 編集日時 2004-06-14 19:56 ]

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