第16回 ASP.NETにおけるページの遷移連載 プログラミングASP.NET ―ASP.NETによるWebアプリケーション実践開発講座― (3/4 ページ)

» 2003年04月05日 00時00分 公開
[田口景介]

 

■フレームとの組み合わせ

 何度も述べているように、ASP.NETのフォームは同一ページにしかポストバックできない。しかし、ポスト先のフレームが同じである必要はない。例えば、ページをleftとrightと名づけた2つのフレームに分割し、leftフレームにフォームを配置したとしよう。このフォームで以下のようにtarget属性を指定しておけば、ポストバックに対するレスポンスは、フォームがあるleftフレームではなく、rightフレームに表示される。

  <form target="right" runat="server">

 このようにただターゲットを指定しただけでは、右フレームにもフォーム・ページが表示されるだけで何のメリットもないが、前述したTransferメソッドによるテクニックを組み合わせれば、例えば前述のサンプル・プログラム(リスト16.2リスト16.3)を、次の画面16.5に示すようにフレームで分割したページとしてデザインできるようになる。

画面16.5 フレーム間でのTransferメソッドの利用
sample02.htmの実行(www.iwebmethod.netのページ)

 このフレーム版サンプル(sample02a.aspx)とリスト16.2(sample01a.aspx)の違いはたった1行、「<form runat="server">」を「<form target="right" runat="server">」に修正しただけだ。sample01b.apxとsample02b.aspxに至っては、まったく同じコードを利用している。これに、リスト16.4に示すフレームセットを記述したhtmlファイルを追加すれば、フレーム版sample01の完成である。

<html>
<head>
<title>sample02</title>
<frameset cols="20%, 80%">
  <frame name="left" src="sample02a.aspx">
  <frame name="right" src="sample02b.aspx">
</frameset>
</head>
</html>

リスト16.4 フレーム版サンプル(sample02.htm)

<%@ Page Language="C#" ClassName="SourcePage" %>
<html>
<head>
<script runat="server">
public string arg;

void Page_Load(object sender, EventArgs e) {
  if (IsPostBack) {
    arg = t.Text;
    Server.Transfer("sample02b.aspx");
  }
}
</script>
</head>
<body>
<form target="right" runat="server">
  <asp:TextBox id="t" runat="server" />
  <asp:Button Text="検索" runat="server" />
</form>
</body>
</html>

リスト16.5 フレーム版サンプル(sample02a.htm)

<%@ Page Language="C#" %>
<%@ Reference Page="sample02a.aspx" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Data" %>
<html>
<head>
<script runat="server">
SourcePage sp;

void Page_Load(object sender, EventArgs e) {
  if (!IsPostBack) {
    if (Context.Handler is SourcePage) {
      sp = (SourcePage) Context.Handler;
      datagrid.DataSource = CreateDataSource(sp.arg);
      datagrid.DataBind();
    } else {
      datagrid.DataSource = CreateDataSource("");
      datagrid.DataBind();
    }
  }
}

ICollection CreateDataSource(string s) {
  DirectoryInfo di = new DirectoryInfo(Server.MapPath("."));
  FileInfo[] fi = di.GetFiles();

  DataTable dt = new DataTable();
  DataRow dr;

  dt.Columns.Add(new DataColumn("fileid", typeof(int)));
  dt.Columns.Add(new DataColumn("filename", typeof(String)));
  dt.Columns.Add(new DataColumn("filesize", typeof(long)));
  dt.Columns.Add(new DataColumn("date", typeof(DateTime)));

  for (int i = 0; i < fi.Length; i++) {
    dr = dt.NewRow();
    dr[0] = i;
    dr[1] = fi[i].Name;
    dr[2] = fi[i].Length;
    dr[3] = fi[i].LastWriteTime;
    dt.Rows.Add(dr);
  }

  DataView dv = new DataView(dt);
  dv.RowFilter = "filename LIKE '*" + s + "*'";

  return dv;
}

</script>
</head>
<body>
  <asp:DataGrid id="datagrid" Width="90%" runat="server" />
</body>
</html>

リスト16.6 フレーム版サンプル(sample02b.htm)
sample02.htm、sample02a.aspx、sample02b.aspxのダウンロード(sample02.zip)

  

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。