- PR -

GridViewのCheckBoxへの設定方法を教えてください

1
投稿者投稿内容
SABU
会議室デビュー日: 2008/02/05
投稿数: 15
投稿日時: 2008-02-05 01:26
VB2005で作成中で、GridViewのテンプレートにCheckBoxをセットしています。
このGridViewのページング時に、ある条件でCheckBoxにチェックを付けて次のページを表示したいのですが、色々試してもうまくいきません。

CheckBoxをクリックし、下記のようにPage_Loadイベントで強制的にTrueをセットすると、うまくセットされます(当然ページングはしませんが・・・)。
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
  For i = 0 To GridView1.PageSize
  myCheck = DirectCast(GridView1.Rows(i).FindControl("SelCB"), CheckBox)
  myCheck.Checked = True
  Next
end sub

そこで、GridView1_PageIndexChangedイベントやform1_Loadイベントの先頭で上記のロジックを入れても、ページングはされますが全てチェックが付かない状態で表示されてしまいます。

殆どのイベントを試したのですがどれもできず、どのイベントで対処すればよいのか分からず困っています。
どなたかご存知の方がいらしたらご教示お願いします。
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2008-02-05 08:03
GridViewのRowDataBoundイベントでCheckBoxのCheckedプロパティを設定したらどうでしょうか。
_________________
ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集
SABU
会議室デビュー日: 2008/02/05
投稿数: 15
投稿日時: 2008-02-05 09:57
Accessさん。アドバイスありがとうございます。

早速試してみまして、このRowDataBoundイベントはGridViewの行数分(?)実行されてるみたいなのですが、実行された時の行番号が取得できず、
DirectCast(GridView1.Rows(i).FindControl("SelCB"), CheckBox)
のRows(i)のiでハンドル例外がおきてしまいます。

このイベント関数の第2パラメータの e を参照して行番号をとろうと思ったのですがうまく取れませんでした。

考え方が違っていますか???

何度もすいませんが、お願いします。。。
THREE-ONE
会議室デビュー日: 2006/04/06
投稿数: 6
投稿日時: 2008-02-05 10:32
e.Row で直接対象行の GridViewRow のインスタンスが取得できますよ。
e.Row.FindControl("SelCB") でいけるはずです。
SABU
会議室デビュー日: 2008/02/05
投稿数: 15
投稿日時: 2008-02-05 11:35
THREE-ONEさん、ありがとうございます。

下記のように(他色々と)やってみたのですが、下記※の箇所で「オブジェクト参照がオブジェクト インスタンスに設定されていません。」でエラーとなりうまくいきませんでした。


Dim myCheck As CheckBox
@ myCheck = e.Row.FindControl("SelCB")
※ myCheck.Checked = True

A myCheck = DirectCast(e.Rows.FindControl("SelCB"), CheckBox)
※ myCheck.Checked = True

プログラミングは今年から始めたばかりで、HELPやWEBにあるソースを見よう見まねでいじっており、専門用語や基本が理解できていないのでご迷惑をお掛けします。
多分、アドバイス頂いた内容を私が理解できていないと思っているのですが、e.Rowのインスタンスを取得して(@やA?)、そのプロパティーのchekedにtrueをセットするやりかたと、このコーディングがだめなのでしょうか???

何度も申し訳ありませんが、お願いします。

くまっち
大ベテラン
会議室デビュー日: 2008/01/18
投稿数: 169
お住まい・勤務地: 茨城県のどこか。
投稿日時: 2008-02-05 12:10
下記の様に、行タイプがデータ行の場合にのみ処理するようにしてみてください。
コード:
If e.Row.RowType = DataControlRowType.DataRow Then
    Dim myCheck As CheckBox
    myCheck = DirectCast(e.Row.FindControl("SelCB"), CheckBox)
    myCheck.Checked = True
End If


RowDataBoundイベントは、ヘッダやフッタ、ページャ等の行からも呼び出されます。
SABU
会議室デビュー日: 2008/02/05
投稿数: 15
投稿日時: 2008-02-05 12:55
くまっちさん、アドバイスと言うか回答をいただき、ありがとうございました。
昼休みにもめげず、出来ました出来ました!!!いま、はしゃいでいます(笑)
もう丸3日、HELPや皆さんの過去ログとか探しにさがして色々と試して、ダメだったので、こちらに投稿させてもらった次第です。
本当にありがとうございました。
THREE-ONEさん、Accessさん、色々なアドバイスやヒントをいただき、ありがとうございました。

>RowDataBoundイベントは、ヘッダやフッタ、ページャ等の行からも呼び出されます。
このRowDataBoundイベントに来たときに、デバッグ(?)にやり方が分からないので、msgboxで何回来たかを数えたのですが、表に設定した10行より多く来ていた(13回)ので不思議に思っていました。
これで意味が分かりました。e.Row.RowType を見ないとダメってことですね。

大変参考、勉強になりました。

次回また投稿する機会がありましたら、回答を求めないで、いただいたヒントで解決できるようになりたいと思います。
ありがとうございました。
1

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