- PR -

ASP.net(C#)でのDataGrid複数DropDownListでの絞込み処理について

1
投稿者投稿内容
未記入
ベテラン
会議室デビュー日: 2005/07/14
投稿数: 66
投稿日時: 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;
  }

}
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-07-14 21:07
 ソースを全部みたわけではありませんが。

 えっと、本当にこのような書き方をしているのでしょうか?だとすると、すべての行でコントロールの名前が同じになっていたりしませんか?(読むの面倒なので、読んでいませんけど)

 それで、ちょっと遠い記憶になってしまっているのですが、Page.Load で毎回 DataBind していたら、イベントは発生しなかったような???

 イベントって、前回の値と違うから発生するんですよね。で、毎回バインドすると、初期値に戻してしまう、のです。初期値に戻ったわけですから、前回からの変更も捨てられ、イベントも発生しない、と。


 で、他人のソースは読みにくいので、処理を日本語に直してみてください。全行コメントをつける、みたいな感じで。そうやって整理していると、解決できることもあります。
_________________
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2005-07-15 08:00
引用:

未記入さんの書き込み (2005-07-14 19:49) より:
はじめまして。
DataGridコントロールを使用し、テンプレートカラムを作成して
2列にDropDownListを配置しているのですが、1列目のDropDownList
を選択しその値をキーに2列目にデータを表示する処理がうまくいきません。


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/14
投稿数: 66
投稿日時: 2005-07-17 16:46
どうもありがとうございます。
結局、Page_Init処理でGridをBindするように作成したところ
うまくできました。
1

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