- - PR -
ASP.net(C#)でのDataGrid複数DropDownListでの絞込み処理について
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-07-14 19:49
はじめまして。
DataGridコントロールを使用し、テンプレートカラムを作成して 2列にDropDownListを配置しているのですが、1列目のDropDownList を選択しその値をキーに2列目にデータを表示する処理がうまくいきません。 cobRecog_SelectedIndexChangedイベントを行の数だけ処理が流れるため、 全ての列2の情報がクリアされてしまいます・・・ 色々、ここのページを参考にさせて頂いて作成したのですがダメでした・・・ わかる方がいらっしゃいましたら、よろしくお願いします。 private void Page_Load(object sender, System.EventArgs e) { DataTable dtTable = new DataTable(); //DropDownList1列目を作成 TemplateColumn NewCol2 = new TemplateColumn(); NewCol2.ItemTemplate = new MyTemplateComb1(); DataGrid1.Columns.Add(NewCol2); //DropDownList2列目を作成 TemplateColumn NewCol3 = new TemplateColumn(); NewCol3.ItemTemplate = new MyTemplateComb2(); DataGrid1.Columns.Add(NewCol3); DataGrid1.DataSource = dtTable; DataGrid1.DataBind(); } //DropDownList1列目のテンプレートカラム処理 class MyTemplateComb1 : ITemplate { ここの処理がDataGridの数だけ呼べばれてしまって選択内容がクリアされてしまいます。 選択された行だけ処理を行いたいのですが・・・ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ //DropDownListのChangeイベントを作成 private void cobRecog_SelectedIndexChanged(object sender, System.EventArgs e) { DropDownList AAA = new DropDownList(); DropDownList BBB = new DropDownList(); AAA = (DropDownList)sender; BBB = (DropDownList)AAA.Parent.FindControl("cob2"); //選択されたAAA.SelectedValueをキーにintId2、strName2にSQLより取得したデータがあります。 BBB.Items.Clear(); for (int i=0;i<intId2.Length;i++) { BBB.Items.Add(strName2[i]); BBB.Items[i].Value = Convert.ToString(intId2[i]); } BBB.Items.Insert(0,""); } public void InstantiateIn(Control container) { DropDownList cobRecog = new DropDownList(); cobRecog.ID = "cob1"; cobRecog.DataBinding += new EventHandler(this.BindName); container.Controls.Add(cobRecog); } public void BindName(Object sender, EventArgs e) { DropDownList cobRecog = (DropDownList) sender; DataGridItem container = (DataGridItem) cobRecog.NamingContainer; //intId、strNameにSQLより取得したデータがあります。 for (int i=0;i<intId.Length;i++) { cobRecog.Items.Add(strName[i]); cobRecog.Items[i].Value = Convert.ToString(intId[i]); } cobRecog.SelectedIndexChanged += new System.EventHandler(this.cobRecog_SelectedIndexChanged); cobRecog.Items.Insert(0,""); cobRecog.AutoPostBack = true; } } //DropDownList2列目のテンプレートカラム処理 class MyTemplateComb2 : ITemplate { public void InstantiateIn(Control container) { DropDownList cobRecog2 = new DropDownList(); cobRecog2.ID = "cob2"; cobRecog2.DataBinding += new EventHandler(this.BindName); container.Controls.Add(cobRecog2); } public void BindName(Object sender, EventArgs e) { DropDownList cobRecog2 = (DropDownList) sender; DataGridItem container = (DataGridItem) cobRecog2.NamingContainer; cobRecog2.Items.Insert(0,""); cobRecog2.AutoPostBack = true; } } | ||||
|
投稿日時: 2005-07-14 21:07
ソースを全部みたわけではありませんが。
えっと、本当にこのような書き方をしているのでしょうか?だとすると、すべての行でコントロールの名前が同じになっていたりしませんか?(読むの面倒なので、読んでいませんけど) それで、ちょっと遠い記憶になってしまっているのですが、Page.Load で毎回 DataBind していたら、イベントは発生しなかったような??? イベントって、前回の値と違うから発生するんですよね。で、毎回バインドすると、初期値に戻してしまう、のです。初期値に戻ったわけですから、前回からの変更も捨てられ、イベントも発生しない、と。 で、他人のソースは読みにくいので、処理を日本語に直してみてください。全行コメントをつける、みたいな感じで。そうやって整理していると、解決できることもあります。 _________________ | ||||
|
投稿日時: 2005-07-15 08:00
DataGridに配置した2個のDropDownListを連動させるサンプルを作成しました。 よろしければ参考にしてください。 http://www.friendlysw.com/samples/articles/deny/030802-1.aspx DropDownListを連動させるには、DropDownList1のSelectedIndexChangedイベントを 利用します。このイベントで、DataGridItemを見つけてたらFindControlメソッド でDropDownList2を見つけます。 DropDownList1のSelectedIndexChangedイベントからDataGridItemを見つけるには NamingContainerを使用します。 _________________ ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集 | ||||
|
投稿日時: 2005-07-17 16:46
どうもありがとうございます。
結局、Page_Init処理でGridをBindするように作成したところ うまくできました。 |
1