我知道很多人都迷惑,怎样处理动态添加的控件的事件..我这里有个简单的例子:
<%@ Page language="c#" Codebehind="FileManager.aspx.cs" AutoEventWireup="false" Inherits="LWSampleCS.FileManager" %>
<%@ Register TagPrefix="LWS" Namespace="LWSampleCS" Assembly="LWSampleCS" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>FileManager</title>
<style> BODY { FONT-SIZE: 9pt } TABLE { FONT-SIZE: 9pt } </style>
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body MS_POSITIONING="FlowLayout">
<form id="Form1" method="post" runat="server">
<P>
<asp:Button id="ButtonRefresh" runat="server" Text="Refresh"></asp:Button></P>
<P>
<LWS:MyPanel id="panel" runat="server">
Here will fill with table
</LWS:MyPanel></P>
<P><INPUT id="File1" type="file" name="File1" runat="server">
<asp:Button id="ButtonUpload" runat="server" Text="Upload"></asp:Button></P>
</form>
</body>
</HTML>
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.IO;
namespace LWSampleCS
{
public class FileManager : System.Web.UI.Page
{
protected System.Web.UI.HtmlControls.HtmlInputFile File1;
protected System.Web.UI.WebControls.Button ButtonUpload;
protected System.Web.UI.WebControls.Button ButtonRefresh;
protected LWSampleCS.MyPanel panel;
private void InitializeComponent()
{
this.ButtonRefresh.Click += new System.EventHandler(this.ButtonRefresh_Click);
this.ButtonUpload.Click += new System.EventHandler(this.ButtonUpload_Click);
}
override protected void OnInit(EventArgs e)
{
InitializeComponent();
base.OnInit(e);
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if(Files==null)
{
ResetTable();
}
else
{
RestoreTable();
}
}
public void FillFiles()
{
string dir=Server.MapPath("Files");
if(!Directory.Exists(dir))
Directory.CreateDirectory(dir);
Files=Directory.GetFiles(dir);
}
public string[] Files
{
get
{
return (string[])ViewState["Files"];
}
set
{
ViewState["Files"]=value;
}
}
public void ResetTable()
{
FillFiles();
panel.Reset();
FillTable();
}
public void RestoreTable()
{
panel.Reset();
FillTable();
}
public void FillTable()
{
Table table=new Table();
table.Attributes["border"]="1";
table.Style["border-collapse"]="collapse";
table.CellPadding=2;
table.CellSpacing=0;
table.Width=Unit.Percentage(100);
TableRow hrow=new TableRow();
TableCell hcell;
hcell=new TableCell();
hcell.Text="FileName";
hrow.Cells.Add(hcell);
hcell=new TableCell();
hcell.Text="CreationTime";
hrow.Cells.Add(hcell);
hcell=new TableCell();
hcell.Text="Delete";
hrow.Cells.Add(hcell);
table.Rows.Add(hrow);
foreach(string file in Files)
{
TableRow row=new TableRow();
TableCell cell;
//FileName
cell=new TableCell();
cell.Text=file;
row.Cells.Add(cell);
//CreationTime
cell=new TableCell();
cell.Text=File.GetCreationTime(file).ToString("yyyy-MM-dd HH:mm:ss");
row.Cells.Add(cell);
//Delete
cell=new TableCell();
row.Cells.Add(cell);
Button ButtonDelete=new Button();
ButtonDelete.Click+=new EventHandler(ButtonDelete_Click);
ButtonDelete.Text="Delete";
ButtonDelete.Attributes["filename"]=file;
cell.Controls.Add(ButtonDelete);
table.Rows.Add(row);
}
panel.Controls.Add(table);
}
private void ButtonRefresh_Click(object sender, System.EventArgs e)
{
ResetTable();
ButtonRefresh.Text="Refresh @ "+DateTime.Now.ToLongTimeString();
}
private void ButtonUpload_Click(object sender, System.EventArgs e)
{
if(File1.PostedFile.FileName!="")
{
string newpath=Path.Combine(Server.MapPath("Files"),Path.GetFileName(File1.PostedFile.FileName));
byte[] buf;
using(Stream stream=File1.PostedFile.InputStream)
{
buf=new byte[stream.Length];
stream.Read(buf,0,buf.Length);
}
using(FileStream fs=new FileStream(newpath,FileMode.Create,FileAccess.Write))
{
fs.Write(buf,0,buf.Length);
}
ResetTable();
ButtonUpload.Text="Upload @ "+DateTime.Now.ToLongTimeString();
}
else
{
ButtonUpload.Text="File? @ "+DateTime.Now.ToLongTimeString();
}
}
private void ButtonDelete_Click(object sender, EventArgs e)
{
Button Btn=(Button)sender;
File.Delete(Btn.Attributes["filename"]);
ResetTable();
}
}
public class MyPanel : Panel , INamingContainer
{
public void Reset()
{
Controls.Clear();
ClearChildViewState();
}
}
}
------------
其实动态添加的控件,最重要是用ViewState保持它的状态,并且在回发后能恢复它们.
这个例子应该打开两个窗口来测试。
其中一个窗口新建了文件,
第二个窗口不选择文件直接Upload是不会见到第一窗口上传的文件的。
(就好象不重新绑定就看不到数据库新的东西一样)
其中 Files 就是储存了某个时刻的文件列表。.