- PR -

DataGridでチェックボックスのIDをcsから設定したいのですが。

投稿者投稿内容
くるくる
常連さん
会議室デビュー日: 2003/09/06
投稿数: 27
投稿日時: 2004-01-05 15:28
毎度お世話になっております。
.NET2003,C#,Webアプリで開発をしています。

データグリッドのチェックボックスについてわからないところが
ありましたので皆様のお力を貸してください。

   列A 列B 列C
----------------------
行A □ □ □
行B □ □ □
行C □ □ □

今私がやりたいことは、上図のような表を作り、DBの値によって表のチェックボックス
にチェックをつけたいのですが、チェックボックスにIDを設定できない為チェックをつ
けることができません。ここでは、列数が可変な為全てコードビハインドファイルから
生成しています。コードは下記となります。

/*** 列数繰り返し ***/
for(){
TemplateColumn tc = new TemplateColumn();
tc.HeaderText = "列"
tc.ItemTemplate = new MyTemplate();

DataGrid.Columns.Add(tc);


public class MyTemplate : ITemplate
{
public void InstantiateIn(Control container)
{
CheckBox cb = new CheckBox();
cb.DataBinding += new EventHandler(this.BindName);
container.Controls.Add(cb);
}

void BindName(Object sender, EventArgs e)
{
CheckBox check = (CheckBox) sender;
DataGridItem container;
container = (DataGridItem) check.NamingContainer;

//DataRowView drv = ((DataRowView)container.DataItem);
//check.ID = drv["SETCOD"].ToString();
}
}

MyTemplateクラスでIDを設定してみましたが、HTMLソースを見てみると
「DataGrid_ctrl2_設定したID」となってしまいます。

コードビハインドからそれぞれのIDをつけるにはどうすればよいのでしょうか?
わかりづらい説明で申し訳ございませんがよろしくお願い致します。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-01-06 06:27
引用:

くるくるさんの書き込み (2004-01-05 15:28) より:

MyTemplateクラスでIDを設定してみましたが、HTMLソースを見てみると
「DataGrid_ctrl2_設定したID」となってしまいます。


 これは、HTML上で「設定したID」のみにしたい、ということでしょうか。それは、たぶん不可能ではないかな?

 サーバコントロールはコンテナコントロールになっていて、コントロールの中にコントロールを含むことができます。このコントロールの上下関係はHTMLにはないため、上位のコントロールから下位のコントロールへの、いわばパス形式でIDがつけられています。
 ビハインドコードで、HTML上でつけられるIDを知るには、ClientIDだったかな?プロパティを見てください。

[ メッセージ編集済み 編集者: Jitta 編集日時 2004-01-06 06:32 ]
くるくる
常連さん
会議室デビュー日: 2003/09/06
投稿数: 27
投稿日時: 2004-01-06 17:12
Jittaさんお返事ありがとうございます。
今までデータグリッド内のIDに疑問を抱いていたのですが
ようやく理解できました。

今回お聞きしたかったのは、下記のソースだと列Aと列BのID
が一緒になってしまうので、一緒にならないようなやり方を
教えて頂こうと思っていましたが、MyTemplateクラスに
コンストラクタを設定することにより解決できました。

ところで、もう1つお聞きしたいことがあるのですがよろしいでしょうか?

   列A 列B 列C
----------------------
行A □ □ □
行B □ □ □
行C □ □ □

上図のような表にチェックをつけ、実行ボタン押下後、
DBに登録(例えば列A行A、列B行B、列C行Bにチェックがある場合は
それぞれのコードを登録する)したいのですが、
動的に作ったカラムはViewStateに保持されていないらしく、
ポストバックしてしまうとカラムが消えてしまうのですが、
これらを保持するにはどうしたら良いのでしょうか?

またまた、わかりづらい説明ですがよろしくお願い致します。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-01-06 18:54
引用:

くるくるさんの書き込み (2004-01-06 17:12) より:

上図のような表にチェックをつけ、実行ボタン押下後、
DBに登録(例えば列A行A、列B行B、列C行Bにチェックがある場合は
それぞれのコードを登録する)したいのですが、
動的に作ったカラムはViewStateに保持されていないらしく、
ポストバックしてしまうとカラムが消えてしまうのですが、
これらを保持するにはどうしたら良いのでしょうか?


 まず、「他の人にわかりづらいかな」と思ったら、わかりやすくなるにはどうすればよいか、考えてください。これは様々な意味で、あなたにとって必要な技術のはずです。

 ポストバックするとカラムが消えるということですが、ViewStateについてはページか、コントロールのEnableViewStateプロパティで制御します。おそらく、Page.LoadイベントハンドラでDataGrid.BindDataメソッドをコールしていないでしょうか。IsPostBackプロパティで判別し、ポストバック時にはバインドしないようにすると、解決すると思います。

 DataGrid内の各セルにアクセスするためには、私が知っているのはDataGrid.Items.CellsプロパティからControlsプロパティを参照することです。もっと楽な方法があるような気もしますが、探すのが面倒なのでとりあえずそれでアクセスしています(ぉぃ)。
くるくる
常連さん
会議室デビュー日: 2003/09/06
投稿数: 27
投稿日時: 2004-01-06 20:06
返信ありがとうございます。

引用:

Jittaさんの書き込み (2004-01-06 18:54) より:

 まず、「他の人にわかりづらいかな」と思ったら、わかりやすくなるにはどうすればよいか、考えてください。これは様々な意味で、あなたにとって必要な技術のはずです。




申し訳ございません。確かにその通りです。以後というか今回から気を付けます。

引用:

Jittaさんの書き込み (2004-01-06 18:54) より:

 ポストバックするとカラムが消えるということですが、ViewStateについてはページか、コントロールのEnableViewStateプロパティで制御します。おそらく、Page.LoadイベントハンドラでDataGrid.BindDataメソッドをコールしていないでしょうか。IsPostBackプロパティで判別し、ポストバック時にはバインドしないようにすると、解決すると思います。



 
EnableViewStateはTrueでした。
またPage.LoadイベントハンドラでDataGrid.BindDataメソッドもコールしていませんでした。
そこで試しにデザイナ上でカラムを1つ作り、残りのカラムはコードビハインド上
で作成し、実行ボタンを押下すると、デザイナ上で作成したカラムは消えずに
残っていました。これはなんででしょうか?
もし仮にコードビハインド上で作成したカラムは保持されない場合、
クライアント側で保持するしか方法はないのでしょうか?

よろしくお願い致します。

todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2004-01-07 12:32
>コードビハインド上で作成したカラム
もしかしてPage.Loadでやっていますか?
DataGrid.Initでやってみては?
くるくる
常連さん
会議室デビュー日: 2003/09/06
投稿数: 27
投稿日時: 2004-01-09 15:37
todoさんありがとうございます。

引用:

todoさんの書き込み (2004-01-07 12:32) より:
>コードビハインド上で作成したカラム
もしかしてPage.Loadでやっていますか?



Page.Loadではやっていません。
引用:

DataGrid.Initでやってみては?



すいません。勉強不足でよくわからないのですが、
DataGrid.Initの中でカラム等を作成するということですか?
まるく
大ベテラン
会議室デビュー日: 2004/01/09
投稿数: 181
投稿日時: 2004-01-09 16:49
はじめまして。
DB格納の件ですが、私もまさに苦労していまして、スマートなやり方があれば是非教えて頂きたいと思います。しかし、どうも自分で色々調べた範囲では無理のように思いました。
私の場合DataGridの特定列全行にTextBoxを表示させ、入力させた値をとりあえずデータソース(DataTable)に書き戻したかったのですが、

1.PostBack時にデータバインドしなければ、ViewStateによって入力値が保持される「ように見える」。

2.TextBoxのインスタンスが実際に生成されるのは、データバインドを行なった時点である(何行あるのかはバインドしないと判らないから)。言い換えるとデータバインドを行なわない限り、サーバ側で処理しているDataGridのインスタンス内にTextBoxが子コントロールとして存在する事はない筈。

3.PostBack時にデータバインドすると、当然だがバインドしたデータソースの値をTextBoxに設定してしまう為、入力値が反映されない。

よって多分動的テンプレートであろうが、静的テンプレートであろうが関係なく無理と判断しました。

以上より、
PostBack時にデータバインドする前に、該当するTextBoxのID文字列を強引に合成して(「DataGrid1__ctl3_コントロールID名」など)、Requestオブジェクトから値を取得してデータソースを更新する方法で逃げましたが、あまり美しくありません。

市販のカスタムコントロールを使う方が良いのかもしれませんね。

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