■フレームとの組み合わせ
何度も述べているように、ASP.NETのフォームは同一ページにしかポストバックできない。しかし、ポスト先のフレームが同じである必要はない。例えば、ページをleftとrightと名づけた2つのフレームに分割し、leftフレームにフォームを配置したとしよう。このフォームで以下のようにtarget属性を指定しておけば、ポストバックに対するレスポンスは、フォームがあるleftフレームではなく、rightフレームに表示される。
<form target="right" runat="server">
このようにただターゲットを指定しただけでは、右フレームにもフォーム・ページが表示されるだけで何のメリットもないが、前述したTransferメソッドによるテクニックを組み合わせれば、例えば前述のサンプル・プログラム(リスト16.2とリスト16.3)を、次の画面16.5に示すようにフレームで分割したページとしてデザインできるようになる。
このフレーム版サンプル(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>
<%@ 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>
<%@ 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>
Copyright© Digital Advantage Corp. All Rights Reserved.