- PR -

DataBridのテンプレートに配置したコントロールにデータバインドする

投稿者投稿内容
なっちゃん
常連さん
会議室デビュー日: 2005/02/11
投稿数: 21
投稿日時: 2005-03-16 08:12
おはようございます、題記の件、質問させてください。
(過去スレッドには目を通したのですが もし見過ごしていたものがあれば指摘してください((^^

C#でWebApliの開発をしています。
DataGridのテンプレート列に、ドロップダウンリストを配置しようとしています。
このドロップダウンリストにデータをバインドさせ、SelectedIndex_Changedイベントなども拾いたいのですが、下記のようなコードで"インスタンスにオブジェクトが参照されていない"とエラーになります。
どなたか 解決策をご存知の方はいらっしゃいませんでしょか。


DropDownList ddlA = (DropDownList)(DataGrid1.FindControl("ddlA").Items).DataBind();
ddlA.DataSource = emp.AllEmproyeeMemeber();
ddlA.DataTextField= "emp_list";
ddlA.DataBind();


[ メッセージ編集済み 編集者: なっちゃん 編集日時 2005-03-16 08:13 ]

[ メッセージ編集済み 編集者: なっちゃん 編集日時 2005-03-16 08:14 ]
えんぞ@?
ぬし
会議室デビュー日: 2004/07/06
投稿数: 271
お住まい・勤務地: はまっこ
投稿日時: 2005-03-16 08:56
どこでエラーとなったのでしょう?

なんとなくFindControlの個所かと思うので、
[ASP.NET]DataGridコントロールの各セルにアクセスするには?
辺りが参考になるかと。
SE卵
大ベテラン
会議室デビュー日: 2004/10/22
投稿数: 135
投稿日時: 2005-03-16 08:59
おはようございます。

んー、"インスタンスにオブジェクトが参照されていない"ということは

DropDownList ddlA = (DropDownList)(DataGrid1.FindControl("ddlA").Items).DataBind();

でddlA がNothingだと思われます。下記のようにしてみては?


DropDownList ddlA = (DropDownList)(DataGrid1.Items(行番号).FindControl("ddlA"))


ジョン吉
常連さん
会議室デビュー日: 2005/02/25
投稿数: 33
投稿日時: 2005-03-16 09:18
このコードどこに記述しています?

多分、なんですが.......。

テンプレート列に貼り付けたコントロールって、「実体」じゃないんですよ。
データグリッドの行が作られるときに、テンプレート列に定義されている内容で、
コントロールを動的に生成しているんです。

visualstudioが自動で作成するコードの中に、テンプレート列に定義したドロップダウンリストはないので、確認してみてください。
(何行作られるかわからないグリッドで、その中のコントロールを予め生成しておくのはむりですよね)

で、このコードがどこに記述されているかがポイントになってくると思うんです。

DataGrid1 のItemDataBound で記述すればいいんじゃないかなと思いますが、
多少、修正は必要です。

ここの掲示板を ItemDataBound で検索してみてください。
ヒントが乗っています(私もそれを参考にしました(^^ゞ )
なっちゃん
常連さん
会議室デビュー日: 2005/02/11
投稿数: 21
投稿日時: 2005-03-16 10:42
お返事ありがとうございます。

>えんぞ@見習いさん
紹介していただいた記事を参考に、

for(int i = 0; i < DataGrid1.Items.Count; i++)
{
DataGridItem myGridItem = DataGrid1.Items[i];
DropDownList ddlA = (DropDownList)myGridItem.FindControl("ddlA");
ddlA.DataSource = emp.AllEmproyeeMemeber();
ddlA.DataTextField= "emp_list";
ddlA.DataBind();
}
で実行することができました。



>SE卵さん
ご指摘いただいたとおり、 ddlAが未定義となっていました。 
ありがとうございます。

>ジョン吉さん
テンプレートにはりつけられたコントロールが「実体」でないということは、
このドロップダウンリストのイベントなんかは拾えないのでしょうか??
(確かに、
this.ddlA.SelectedIndex_Changed += new System.EventHandler(this.ddlA_SelectedIndex_Changed);

でエラーとなりました。。) あきらめるべきでしょうか。。
ジョン吉
常連さん
会議室デビュー日: 2005/02/25
投稿数: 33
投稿日時: 2005-03-16 11:15
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=19002&forum=7

このスレッドが参考になりますよ。
HTML側でイベントの定義をしてあげればできると思いますよ。
linkButton や chekbox radiobutton はこの方法でうまくイベントを定義できました
なっちゃん
常連さん
会議室デビュー日: 2005/02/11
投稿数: 21
投稿日時: 2005-03-16 17:53
>ジョン吉さん 
お返事ありがとうございます。

色々と格闘してみたのですが、objectをコントロール型に変換することができません。
(ドロップダウンリストの選択されたインデックス番号を取得することが出来ない)

public void ddlA_SelectedChanged(object sender, System.EventArgs e)
{
//ここで、変換できずにエラー
int i = (DropDownList)(object).selectedIndex;
}


重ねて何度も申しわけないです おわかりでしたら教えてください。


[ メッセージ編集済み 編集者: なっちゃん 編集日時 2005-03-16 17:55 ]
ジョン吉
常連さん
会議室デビュー日: 2005/02/25
投稿数: 33
投稿日時: 2005-03-16 18:09
すいません C# の文法がわからないので、VB で記述すると

dim i as integer = ctype(sender,DoropDownList).selectedIndex

になると思うのですが

多分、
int i = (DropDownList)(sender).selectedIndex;

になるんじゃないですか?

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