- PR -

【C#】テンプレート列に埋め込んだコントロールのイベント発生行数取得方法

投稿者投稿内容
村長
ベテラン
会議室デビュー日: 2005/04/20
投稿数: 67
投稿日時: 2005-11-11 16:06
いつもお世話になっています。

データグリッドのテンプレート列にチェックボックスを埋め込み、
チェックされたタイミングでDB更新処理を行いたいのですが、データグリッドの
何行目のチェックボックスがチェックされたのか知る方法はないでしょうか?

過去ログをみてVB.NETでのやり方を見つけたのですが、C#に応用できません。


SE卵
大ベテラン
会議室デビュー日: 2004/10/22
投稿数: 135
投稿日時: 2005-11-11 16:15
どうも、SE卵です。
過去ログの場所を教えてください。

っていうか、チェックボックスのイベントを拾うんですよね?

何行目かというのは、DataGridのイベントではe.Item.ItemIndex
で取得可能だけど、チェックボックスのイベントでは無理じゃない
ですか?

勘違いしてるかもしれませんが、ひょっとしてチェックされたコン
トロールと同じ行にある他のコントロールを取得して行数を把握す
るやり方ですか?

あっひょっとしてWinアプリ?

[ メッセージ編集済み 編集者: SE卵 編集日時 2005-11-11 16:15 ]
村長
ベテラン
会議室デビュー日: 2005/04/20
投稿数: 67
投稿日時: 2005-11-11 16:46
引用:

勘違いしてるかもしれませんが、ひょっとしてチェックされたコン
トロールと同じ行にある他のコントロールを取得して行数を把握す
るやり方ですか?



すみません、過去ログを見つけられませんでした。
というのも前回探したのは半月以上前で、別アプリを作成してた時なんですが、
その時は時間的な問題もあり、仕様を変更して作成しました。
もしかしたらVB.NETでのやり方があったのも記憶違いかもしれません。

やりたいことですが、SE卵さんの理解とほぼ同じで
チェックされた行の別列の情報をキーにDB更新したいと考えています。

例を挙げて説明すると、
1.ユーザがデータグリッドの5行目のチェックボックスをチェックする
  (チェックボックスのチェックイベント発生)
2.5行目の1,2番目の列の情報をキーとしてDBを更新する
という感じです。

これをWEBアプリで実現しようと考えています。
私もなんとなく無理かと思いますが、もしかしたらやり方があるのでは?と思い
質問させてもらいました。
やっぱり無理でしょうか?
SE卵
大ベテラン
会議室デビュー日: 2004/10/22
投稿数: 135
投稿日時: 2005-11-11 16:55
いや、結論から言うと可能ですよ。

チェックボックスのイベント取得までは出来ているんですよね?

そしたら、CType(sender, CheckBox)みたいな形でsenderオブ
ジェクトをチェックボックスにキャストしてあげて、その後、そ
のチェックボックスのParentをFindControl("ユニークキー格納ID")
で探せば、可能ですよ。

言葉じゃ分かりにくいか。。。VBでごめんなさい。
コード:
Dim chkBox As CheckBox
chkBox = CType(sender, ListBox)
何らかのコントロール = chkBox.Parent.FindControl("ユニークキー格納ID")


SE卵
大ベテラン
会議室デビュー日: 2004/10/22
投稿数: 135
投稿日時: 2005-11-11 17:00
自信ないけど、C#だと、

コード:
chkBox = CType(sender, ListBox);
何らかのコントロール = (Control)chkBox.parent.FindControl("ユニークID");


村長
ベテラン
会議室デビュー日: 2005/04/20
投稿数: 67
投稿日時: 2005-11-11 17:37
引用:

chkBox = CType(sender, ListBox);
何らかのコントロール = (Control)chkBox.parent.FindControl("ユニークID");
[/code]



CheckBox cb = (CheckBox)sender;
ラベル = ((CheckBox)cb.Parent.FindControl("ID")).Checked.ToString();

この方法でチェックされたチェックボックスを特定することを確認しましたが、
データグリッドの何番目?というのは、ここからどうたどれば良いのでしょうか?

SE卵
大ベテラン
会議室デビュー日: 2004/10/22
投稿数: 135
投稿日時: 2005-11-14 12:01
返信遅くなってすいません。立て込んでいましたので。。。

ここまでで、DB更新処理に必要な情報は取得できているはずです。
それでもなお行番号が必要なのでしょうか?

どうしてもというなら、行番号列を追加してあげて、そこに行番号ラベル
かなんか配置して、Parent.FindControlで取得すれば良いかと。。。
もちろん、デザイン上、行番号が見えるのがまずいのであれば、列ごと非
表示にしてあげれば良いと思います。

ただ、今回はチェックされたタイミングでDB更新処理を行いたいと
言う事でしたよね。行番号は必要ないと思うのですが、その他にも何か
使用したい用途があるのでしょうか?

村長
ベテラン
会議室デビュー日: 2005/04/20
投稿数: 67
投稿日時: 2005-11-14 13:22
引用:

ここまでで、DB更新処理に必要な情報は取得できているはずです。
それでもなお行番号が必要なのでしょうか?



チェックされたチェックボックスの位置はわかりましたが、同列の他のセル情報は
この状態からどうやって取得すれば良いのでしょうか?
私はデータグリッドから値を取得するには DataGrid.Item[行番号].Cell[列番号].Text
しかないかと思って行番号がわからないと・・・と思ったんですが、他に取得する方法が
あるのでしょうか?

例えば、データグリッドが以下の場合(選択列がチェックボックス)

項目1 項目2 選択
100   A   □
200   B   □
300   C   □

項目1が200の行の選択がチェックされたとして、項目1の200と項目2のBという
値は、どのように取得すれば良いのでしょうか?


過去ログから他の列のコントロールは
listA= CType(sender, ListBox )
listB = listA.Parent.FindControl("listBのID")
で取得できることがわかったんですが、値を取得したい場所がコントロールでない場合
(普通の列)の取得方法がわかりません。

値を取得する場所は全てラベルか何かのコントロールにしてFindControlで探す?のでしょうか?

最後の最後まで質問してしまいすみませんが、
教えて頂けると助かります。

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