- PR -

[C#] DataGridのフッターに入力用のDropDownListを配置したい

1
投稿者投稿内容
Qoo
常連さん
会議室デビュー日: 2006/05/18
投稿数: 37
投稿日時: 2006-05-31 11:45
いつもお世話になっています。
C#(ASP.NET)でWebアプリを作成しています。

http://www.atmarkit.co.jp/fdotnet/dotnettips/085insertdg/insertdg.html

ここを参考にDataGridのフッターに追加入力用のTextBoxを配置して追加できるように
はなったのですが、今度はこのテンプレート列のフッターにTextBoxじゃなく
DropDownListを配置したいのです。「テンプレートの編集」機能でDropDownListを
DataGridのフッター内に置いてはあるんですが、このDropDownListに初期値を
持たせる為のイベントがよく分かりません。最終的にはDBから初期値を読み込んで
持たせたいのですがとりあえずテスト用にプログラムの中に直書きしようと思って
います。

ItemCreatedイベントやItemDataBoundイベント等に

  DropDownList ddl1 = (DropDownList)e.Item.FindControl("ddl_meisai");
  ddl1.Items.Add("aaa");
  ddl1.Items.Add("bbb");

と書いてみましたがうまくいきません。
イベントが間違っているのでしょうか?それともそれ以前の問題なのでしょうか?
ご存知の方、ご教授お願いします。


しょくぱん
常連さん
会議室デビュー日: 2006/05/31
投稿数: 31
投稿日時: 2006-05-31 17:58
はじめまして。
初投稿です。ドキドキ★

とりあえずいただいた情報から同じように書いてみました。
DataGridのItemDataBoundイベントにこのように書いたらうまく表示されましたよ?

private void DataGrid1_ItemBound(object sender, DataGridItemEventArgs e) {
  if (e.Item.ItemType == ListItemType.Footer)
  {
    DropDownList ddl = (DropDownList)e.Item.FindControl("ddl_meisai");
    if (ddl != null)
    {
      ddl.Items.Add("aaa");
      ddl.Items.Add("bbb");
    }
  }
}

[ メッセージ編集済み 編集者: しょくぱん 編集日時 2006-05-31 21:47 ]
Qoo
常連さん
会議室デビュー日: 2006/05/18
投稿数: 37
投稿日時: 2006-06-01 10:02
しょくぱんさん、ありがとうございます。
しょくぱんさんに示して頂いたコードを試したところ
うまくいきました。本当にありがとうです。

ItemDataBoundイベントはDataGridにデータを連結した後に発生すると
ヘルプに書いてあったので、何となくここかなぁとは思っていたんですが
具体的なコードが分からず困っていました

if (e.Item.ItemType == ListItemType.Footer)

正直、未だこのif文が具体的に何を聞いているのかよく分かっていません。
たぶん、何かがフッターならこの処理みたいな意味だとは思うんですが
これはどういう意味のif文なんでしょうか?
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-06-01 10:30
引用:

Qさんの書き込み (2006-06-01 10:02) より:

ItemDataBoundイベントはDataGridにデータを連結した後に発生すると
ヘルプに書いてあったので、何となくここかなぁとは思っていたんですが
具体的なコードが分からず困っていました


ん?、null でなければ Add する方法でうまくいった訳ですよね?
どちらも、ItemDataBound イベントで処理させるのは同じと書いてありますが・・・


if (e.Item.ItemType == ListItemType.Footer)

正直、未だこのif文が具体的に何を聞いているのかよく分かっていません。
たぶん、何かがフッターならこの処理みたいな意味だとは思うんですが
これはどういう意味のif文なんでしょうか?
[/quote]
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2006-06-01 11:21
こんにちは。

引用:

Qさんの書き込み (2006-06-01 10:02) より:

ItemDataBoundイベントはDataGridにデータを連結した後に発生すると
ヘルプに書いてあったので、何となくここかなぁとは思っていたんですが
具体的なコードが分からず困っていました


もう少し注意深くヘルプを見てみると、いろいろわかるかもしれませんね。

たとえば、まず DataGrid.ItemDataBound イベント
http://msdn2.microsoft.com/ja-JP/library/system.web.ui.webcontrols.datagrid.itemdatabound.aspx
から、しょくぱんさんが参照している DataGridItemEventHandler とはなんだろう、と
調べて
http://msdn2.microsoft.com/ja-jp/library/system.web.ui.webcontrols.datagriditemeventhandler.aspx
ここにたどり着きますよね。
そこで e は DataGridItemEventArgs クラスだということがわかるので、そこから
DataGridItemEventArgs クラスのメンバを探します
http://msdn2.microsoft.com/ja-jp/library/system.web.ui.webcontrols.datagriditemeventargs_members.aspx
同様にリンクをたどっていって e.Item が DataGridItem クラスということでこれも同様に
メンバを探します。
その中に ItemType (ListItemType クラス)があるので、そこを見ます。
http://msdn2.microsoft.com/ja-jp/library/system.web.ui.webcontrols.datagriditem.itemtype.aspx
ここまでくるとわかるかと思いますが、 ItemDataBound イベントはデータ連結された後
に起こるイベントで、フッタのタイミング以外でも起きています。そして現在のイベントがど
のタイミングで起きているのかを示すのが e.Item.ItemType だとわかるでしょう。
(慣れてくれば ListItemType.Footer を見ただけでキュピーンとくるようになると思います)

しょくぱんさんの示していただいたコードは、まず現在のイベントが起きているタイミングがフ
ッタであるかどうかを判別し、その上で ddl_meisai というコントロールを探し、それが存
在していれば項目を追加する、という処理をしています。
Q さんが最初に書かれたコードでは、フッタ以外のタイミングでも ddl_meisai というコン
トロールを探し、存在しているかチェックせずに項目の追加を行っているので、実行時に
ぬるぽ…もとい NullReferenceException が発生してしまうのではないでしょうか(フッ
タ以外では見つからなさそうですし)。

悩んだときはヘルプ(MSDN)を目ン玉ぁかっぽじって見てみると、解決の糸口が見つかる
ことも(結構な確率で)ありますのでがんばってみてください。

[ メッセージ編集済み 編集者: ぽぴ王子 編集日時 2006-06-01 11:22 ]
1

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