- PR -

DataGrid内のDropDownListで他カラムの値を変更させたい

1
投稿者投稿内容
あかし
常連さん
会議室デビュー日: 2003/11/27
投稿数: 24
投稿日時: 2004-01-20 10:29
あかしと申します。いつもお世話になっております。
ASP.NET(C#)でWebアプリケーションを開発中です。
DataGridでお聞きしたいことがあります。

仮に以下の2つのテーブルがあるとします。
ユーザーテーブル          部署テーブル
ユーザー名  部署ID       部署ID   部署名
あああ      2         1     A部署
いいい      3         2     B部署
ううう      2         3     C部署

DataGridで、ユーザーテーブルを表示する場合に
ユーザー名   部署ID   部署名
あああ       2     B部署
いいい       3     C部署
ううう       2     B部署
と表示し、かつ編集モードで部署名をDropDownListにしたいのです。

ユーザー:あああの部署名をDropDownListでA部署に変更し、更新ボタンをクリックすると
ユーザー名   部署ID   部署名
あああ      1     A部署
いいい      3     C部署
ううう      2     B部署
と再表示されるようにしたいのですが、

1)Page_Load時に部署IDに対応した部署名を表示するのにはどうすればいいのでしょうか?
(.NET TIPSの「DataGridコントロール内のドロップダウンリストに動的に項目を追加する
には」を参考にして、編集ボタンクリック時にはリストは表示されるようになっています。
Page_Load時に部署IDから検索した部署名を
_dt = new DataTable();
_dt.Columns.Add(new DataColumn("USERID", typeof(string)));
_dt.Columns.Add(new DataColumn("BUSYOID", typeof(string)));
//DwopDownListカラムの設定。タイプがstringではだめでしょうか?
_dt.Columns.Add(new DataColumn("BUSYONAME", typeof(string)));
DataRow dr = _dt.NewRow();
dr["USERID"] = user;
dr["BUSYOID"] = busyoid;
dr["BUSYONAME"] = busyoname;//DBから検索した部署名
_dt.Rows.Add(dr);

とし、
 MyGrid.DataSource = _dt;
 MyGrid.DataBind();
としているのですが、(.NET TIPS「DataGridコントロールで編集を可能にするには」参照)
初期状態ではなにも表示されません。

2)DropDownList変更後、更新ボタンクリック時に部署IDカラムの値を部署名に対応した
部署IDに変更するにはどうすればよいのでしょうか?

TIPS等いろいろ見ているのですが、行き詰まってしまいました。
ヒント、参考URL等でも結構ですので、教えていただければ幸いです。
ゆうじゅん
ぬし
会議室デビュー日: 2004/01/16
投稿数: 347
投稿日時: 2004-01-20 15:23
DataBindではDropDownListの選択は変更されないので自分で選択してあげる必要があります。
DropDownListのTextに部署名、Valueに部署IDが入っているとします。

ItemDataBoundイベントでコードに応じてDropDownListを選択します。

private System.Web.UI.Control GetContrl( System.Web.UI.ControlCollection Controls, Type contrlType )
{
 foreach( System.Web.UI.Control ctrl in Controls )
 {
  if( ctrl.GetType() == contrlType )
   return ctrl;
 }
 return null;
}

private void SelectDropDownList( DropDownList list, String selectValue )
{
 // ドロップダウンリストから指定されたテキストの行を検索
 list.SelectedIndex = -1;
 foreach( ListItem item in list.Items )
 {
 // 指定されたテキストの行が検索された場合
  if( item.Value == selectValue )
  {
   // 検索された行を選択
   item.Selected = true;
   break;
  }
 }
}

private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
 if( e.Item.ItemType == ListItemType.EditItem )
 {
  // ドロップダウンコントロールを取得
  DropDownList list = (DropDownList)GetContrl( e.Item.Cells[2].Controls, typeof(DropDownList));
  // コードのテキストボックスを取得
  TextBox editCode = (TextBox)GetContrl( e.Item.Cells[1].Controls, typeof(TextBox));
  // コードに応じてドロップダウンを選択
  SelectDropDownList( list, editCode.Text );
 }
}


保存時はDropDownListのSelectedItem.Valueをテーブルの部署IDに設定して
あげれば大丈夫だと思います。
あかし
常連さん
会議室デビュー日: 2003/11/27
投稿数: 24
投稿日時: 2004-01-22 11:21
あかしです。
ゆうじゅんさん、返答ありがとうございます。
教えて頂いたソースを元に、今作成しているところです。

もう一点教えていただきたいのですが、
DataGridで
ユーザー名 部署ID 部署名
あああ    1   A部署
いいい    2   B部署
の場合で、部署IDをReadOnly=trueにすると
TextBox editCode = (TextBox)GetContrl( e.Item.Cells[1].Controls, typeof(TextBox)); でコントロールを取得することが(当然ながら)できません。
nullになってしまいます。
ReadOnly属性を持つカラムのコントロール値を取得する場合はどうすればいいのでしょうか?
e.Item.Cells[1].Textとかいろいろやってみたのですが未だ取得できません。

部署IDは直接変更されたくないのでReadOnlyにし、部署名を変更することで連動して
変更させたいのです。
よろしくお願いいたします。
ゆうじゅん
ぬし
会議室デビュー日: 2004/01/16
投稿数: 347
投稿日時: 2004-01-22 11:53
e.Item.Cells[1].Textで値そのものが取得できるので
↓で対応できると思います。

// コードに応じてドロップダウンを選択
 SelectDropDownList( list, e.Item.Cells[1].Text );
あかし
常連さん
会議室デビュー日: 2003/11/27
投稿数: 24
投稿日時: 2004-01-30 14:12
あかしです。
別件の作業が入っていたため、返答が遅れて申し訳ありません。
ゆうじゅんさん、ご親切にありがとうございました。
まだコードは完成していませんが、完成すればここに載せたいと思っています。
1

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