- PR -

datagridのテンプレート列の値を取得できない...

1
投稿者投稿内容
b.s.n
常連さん
会議室デビュー日: 2002/10/18
投稿数: 28
投稿日時: 2002-12-02 20:23
いつも、参考にさせてもらっております。

Datagridのテンプレート列から値を取得したいのですがうまく取得できません。
どなたかご存じのかた方法を教えてください〜。

【設定】
datagridは、テンプレートカラムにテキストボックスを張り付けて表示させています。
1行には、バウンドアイテムのラベル(見出し列として)も存在しています。
なお、更新・編集ボタンなどの各種ボタンは設置してません。
この状態で
ページロード時として、データセットに実テーブルからの値を動的にセットして、
datagridを表示します。
ページがロード完了後、サーバコントロールのボタンを利用して、呼び出したボタン押下
イベント処理内で、テンプレート列の値を読みとりたいのですが、
・バウンドアイテムの値しかとれない。
・selectindex、edlititemindexなどを指定しても””で返されます。
※ このときの取得方法は、a = datagrid1.items.item(0).cells(0).text です。
・textbox1 = ctype(DataGrid1.Items(0).Cells(0).FindControl("textbox2"),textbox)
などの方法も試しましたがとれませんでした。

おそらく、取得先がバウンドアイテムの方法しかしらないのがだめなのかもしれませんが、
エディットカラム、テンプレート列内に張り付けたコントロールからアクセスする方法を
ご存じのかた、教えてください。
(そもそもオブジェクトの考え方が違う!などご指導いただければ幸いです。)

よろしくお願いします。
焼きそば
ベテラン
会議室デビュー日: 2002/11/06
投稿数: 86
お住まい・勤務地: 東京
投稿日時: 2002-12-03 08:33
テンプレートのテキストボックスの値が取りたいんでしたら、
((TextBox)DataGrid1.Items[0].Cells[0].FindControl("TextBox1")).Text
で取れると思いますが、これが回答かどうかは文面から読み取れませんでした。
違ってたらごめんなさい。
べーちゃん
大ベテラン
会議室デビュー日: 2002/07/21
投稿数: 121
投稿日時: 2002-12-03 08:42
>datagridは、テンプレートカラムにテキストボックスを張り付けて表示させています。
>ページがロード完了後、サーバコントロールのボタンを利用して、呼び出した
>ボタン押下 イベント処理内で、テンプレート列の値を読みとりたいのですが

まず、質問なんですが、画面が表示されている状態でテキストボックスは
ちゃんと表示されていますでしょうか?
もし、ちゃんと表示されているのであれば
>textbox1 = ctype(DataGrid1.Items(0).Cells(0).FindControl("textbox2"),textbox)

DataGrid1.Items(0).FindControl("textbox2")でもだめですか?
もちろん、貼り付けられたテキストボックスはtextbox2ですよね。
b.s.n
常連さん
会議室デビュー日: 2002/10/18
投稿数: 28
投稿日時: 2002-12-03 11:50
いくつかのご回答ありがとうございました。
お二人のご指摘内容でうまくいきました。

Ctype(dataGrid1.item.items(0).cells(0).findcontrol("Textbox2"),textbox).text
にて、一行目一列目2つ目のテンプレートアイテムコントロール値の取得が可能でした。
ありがとうございました。
頭がてんぱっていたのか、列を0にしておきながら3列目のコントロールIDを書いて
しまっていました。(本当は、textbox3でした)

ちなみに現在は、動的にコントロールを読みとりにするためにラベルとテキストボックスを
テンプレート列に張り付けて、dataGrid1.item.items(0).cells(0).controls(1).visible = flase
dataGrid1.item.items(0).cells(0).controls(3).visible = trueの様に切り替えたりする処理などを試しています。(あまりよろしくない方法?)

すみません、新しくスレッドをたてるべきなのかもしれませんが、便乗質問です。

【疑問1】
実際、
〜.controls(0)、(1)、(3)などの順で指定する限り常に
バウンドアイテム、テンプレート内コントロール1、コントロール2の
コントロールを利用することが可能なのですが、これは
(0) ... バウンドアイテム
(1) ... コントロール1の情報1
(2) ... コントロール1の情報2(なのかはよくわかりませんが)
(3) ... コントロール2の情報1
(4) ... コントロール2の情報2(なのかもよくわかりませんが...)
というのは、固定的にアクセスが可能なものとして設計されているのでしょうか?

【疑問2】
オブジェクト階層が固定的に入ってこないとすれば、findcontrol("コントロールid")を
利用した方が、正しいやり方の気がします。
が、仮に複数列のテンプレート列を作成した場合、それらのコントロール名をすべて
同一の値にするのは許されるのでしょうか?
一応、IDE的には、HTMLエディタ側で重複コントロール名に赤波線が引かれます。(エラーにはならない)
動的にコントロールをいじれるようにする設計ではないのかすら解りません。
ご存じのかたいらっしゃいましたらご返答いただければ幸いです。

よろしくお願いします。

べーちゃん
大ベテラン
会議室デビュー日: 2002/07/21
投稿数: 121
投稿日時: 2002-12-04 04:40
>疑問1
>〜.controls(0)、(1)、(3)などの順で指定する限り常に
>固定的にアクセスが可能なものとして設計されているのでしょうか?

一応規則性はあるようですが、ヘルプで該当する部分に関する記述を
探したことがありますが、見つからなかったのでわかりかねます。

>疑問2
>オブジェクト階層が固定的に入ってこないとすれば、findcontrol("コントロールid")を
>利用した方が、正しいやり方の気がします。

そうですね

>が、仮に複数列のテンプレート列を作成した場合、それらのコントロール名をすべて
>同一の値にするのは許されるのでしょうか?
>一応、IDE的には、HTMLエディタ側で重複コントロール名に赤波線が引かれます。(エラーにはならない)

コンパイラがプログラムロジック的にエラーがないというだけで、赤波線が
引かれているということは立派なエラーということですよね。HTMLの。
もともと、DataGridで使用するコントロールは動的に生成されるので
コンパイラではエラーがでません。動作が保障されなくなるということです。
ということで個別の名称をつけられることをお勧めします。

>動的にコントロールをいじれるようにする設計ではないのかすら解りません。

基本的には通常のコントロールと同じように扱えるはずですが。


b.s.n
常連さん
会議室デビュー日: 2002/10/18
投稿数: 28
投稿日時: 2002-12-06 14:29
お礼が遅くなりました。
ぺーちゃんさん、返信ありがとうございます。

早速、コントロールIDを変更して、気分すっきりです。(苦笑
findcontrolを使う方法だけは、ロジックの簡素化もあり今回は妥協してしまいましたが・・。
一応、試してみた感じでは、controls(xx)は、バウンド列、アイテム列、エディット列の順に
それぞれ左から順に張り付いているコントロールの順のようです。
(やってみて、やっぱり正しい方法ではないなぁと実感していますが。恐っ!)
時間があるときにでもMSか、ヘルプを頼って確認してみようと思います。
御指南ありがとうございました。

未だに、ASP.NETに限らずコントロールオブジェクトの基本的な理解が
できていないので、いろいろとアホぅな質問をしてしまうことが多いのですが、
これからも.netでの開発の想定された開発の仕方などを学びたいので、
ベテランの方々、ご指導お願いします。(って、ただのお礼になってしまった。)

Matsu
会議室デビュー日: 2002/12/05
投稿数: 5
投稿日時: 2002-12-09 15:53
DataGridについて同様なことをしているので
参考になればと思いまして、返信します。
見当はずれでしたら、すみません。

DataGridのテンプレート列で編集モードに
なっていないときのデータの取得についてですが、

'宣言
Dim aaa As System.Web.UI.DataBoundLiteralControl
'取得したいセルを指定
aaa = e.Item.Cells(3).Controls(0)
'リターン文字とタブ文字を削除
bufstr = aaa.Text.Replace(Microsoft.VisualBasic.vbCrLf, "")
DATA = bufstr.Replace(Microsoft.VisualBasic.vbTab, "")

で取得することができました。
これは編集モードで、取得したいセルがテキストボックス等に
変わってしまう場合はエラーになるので切り分けが必要です。
1

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