- PR -

datagridと、その中のDropDownListで階層データを表示するサンプルを作ってみたものの

1
投稿者投稿内容
naomix
ベテラン
会議室デビュー日: 2003/02/01
投稿数: 56
投稿日時: 2003-06-29 14:32
以下のコードでうまく動きましたが、不可解な点と不満な点があります。

コード:
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.OleDb" %>
<%@ Page language="c#"%>
<HTML>
<HEAD>
<script runat="server">
void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
  {
    OleDbConnection conn = new OleDbConnection (<接続文字列>);//Connectionオブジェクト作成
    try
    {
      conn.Open ();                            //データベース接続を確立
      OleDbCommand cmd = new OleDbCommand ();  //Commandオブジェクト
      cmd.Connection = conn;

      cmd.CommandText = "SELECT CODE, NM FROM TABLE1";
			
      OleDbDataAdapter adapter = new OleDbDataAdapter (cmd);
      DataSet ds = new DataSet ();
      adapter.Fill (ds, "dt1");

      cmd.CommandText = "SELECT CODE, V, T FROM TABLE2";
			
      adapter.SelectCommand = cmd;
      adapter.Fill (ds, "dt2");
			
      //リレーション追加
      ds.Relations.Add("Rel1", ds.Tables["dt1"].Columns["CODE"], ds.Tables["dt2"].Columns["CODE"],false);
      dtgrid.DataSource = ds.Tables["dt1"];
      dtgrid.DataBind ();
    }

    catch (OleDbException ex) 
    {
	  //エラー処理
    }
            
    catch (Exception ex) 
    {
	  //エラー処理
    }
        
    finally 
    {
      conn.Close (); //データデース接続を閉じる
    }
  }
}

ICollection CrDataSource (DataRow[] drs)
{
  DataTable dt = new DataTable ();
  dt.Columns.Add("T", typeof(string));
  dt.Columns.Add("V", typeof(string));
  foreach (DataRow dr in drs)
  {
    DataRow newRow = dt.NewRow ();//新規DataRowを作成
    newRow["T"] = dr["T"];        //DataRowを初期化
    newRow["V"] = dr["V"];
    dt.Rows.Add (newRow);         //DataRowをDataTableに追加
  }
  DataView dv = new DataView(dt);
  return dv;
}
</script>
</HEAD>
  <body>
    <form runat="server">
      <asp:datagrid id="dtgrid" runat="server" ShowHeader="False" AutoGenerateColumns="False" GridLines="None">
        <Columns>
           <asp:TemplateColumn>
              <ItemTemplate>
                 <%# DataBinder.Eval(Container.DataItem, "NM") %>
              </ItemTemplate>
           </asp:TemplateColumn>
           <asp:TemplateColumn>
              <ItemTemplate>
                 <asp:DropDownList id="ddl" runat="server" DataValueField="V" DataTextField="T" datasource='<%# CrDataSource (((DataRowView)Container.DataItem).Row.GetChildRows("Rel1")) %>'>
                 </asp:DropDownList>
              </ItemTemplate>
           </asp:TemplateColumn>
        </Columns>
      </asp:datagrid> 
    </form>
  </body>
</HTML>



「ネストした Repeater コントロールと Visual C# を使用して階層データを表示する方法」
http://support.microsoft.com/default.aspx?scid=kb;ja;jp306154
の例のようにDropDownListのdatasourceを
datasource='<%# ((DataRowView)Container.DataItem).Row.GetChildRows("Rel1") %>'>
のようにするとうまくいかなかったので、
CrDataSourceメソッド内でDataViewに変換しました。
この理論的な理由がわからず、不可解です。
また、
CrDataSourceメソッド内で、DataTableのスキーマを定義し、
ループしてデータを、DataRow配列からDataTableに移しているのですが、
もっとエクセレントに一発で、できないものかな〜
と不満に思っています。

自分ならこうする!
という方いらっしゃいましたら、
ご意見お持ちしています。
1

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