我知道很多人都迷惑,怎样处理动态添加的控件的事件..我这里有个简单的例子:

Lostinet 2003-12-12 10:39:58
<%@ 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 就是储存了某个时刻的文件列表。.

...全文
54 21 打赏 收藏 举报
写回复
21 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
yzb7811 2004-01-05
非常感谢,试一下先,
  • 打赏
  • 举报
回复
chenlh 2003-12-23
Thanks for 迷失网络。
  • 打赏
  • 举报
回复
charlse12 2003-12-17
收到!!!
  • 打赏
  • 举报
回复
javacofe 2003-12-17
up
  • 打赏
  • 举报
回复
brightheroes 2003-12-17
收藏
  • 打赏
  • 举报
回复
ponycsdn 2003-12-17
收藏
  • 打赏
  • 举报
回复
Lostinet 2003-12-17
不知道为什么发了两帖了。
原帖在:
http://expert.csdn.net/Expert/TopicView1.asp?id=2555813
那里有最后的更新下载
http://www.lostinet.com/files/FileManager.rar
  • 打赏
  • 举报
回复
Lostinet 2003-12-17
to:chenlh(黑色)
可能asp.net1.0的File1.PostedFile会返回null吧.

to: gj0001(阿江)
页面上有个 <% Register %> 标记的.
你可以去看看参考dotnet sdk文档.


.NET Framework SDK -> 参考 -> ASP.NET 语法 -> Web 窗体语法 -> 指令语法 -> Register
  • 打赏
  • 举报
回复
houjianxun 2003-12-17
帮你顶一下
  • 打赏
  • 举报
回复
Nicholasqpl 2003-12-17
up,好,收藏
  • 打赏
  • 举报
回复
gj0001 2003-12-13
有了
public class MyPanel : Panel , INamingContainer
{
public void Reset()
{
Controls.Clear();
ClearChildViewState();
}
}
如何拖到aspx页面上啊!
  • 打赏
  • 举报
回复
wwl1981 2003-12-12
好人,学习
  • 打赏
  • 举报
回复
lpc007 2003-12-12
收到,保存~~
  • 打赏
  • 举报
回复
wyfwyf2000 2003-12-12
多谢,学习
  • 打赏
  • 举报
回复
jhonsn 2003-12-12
thank you
  • 打赏
  • 举报
回复
Lostinet 2003-12-12

----重要提醒----
----重要提醒----
----重要提醒----
----重要提醒----


不要把例子放到公网上测试.
别人可以上传*.aspx来黑你的电脑.
也可以修改ViewState来删除你重要的东西。


----重要提醒----
----重要提醒----
----重要提醒----
----重要提醒----

  • 打赏
  • 举报
回复
goody9807 2003-12-12
谢了
  • 打赏
  • 举报
回复
lanyahuhu 2003-12-12
thank you
  • 打赏
  • 举报
回复
chenlh 2003-12-12
点UPLOAD时,出现:

说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。

源错误:


行 148: private void ButtonUpload_Click(object sender, System.EventArgs e)
行 149: {
行 150: if(File1.PostedFile.FileName!="")
行 151: {
行 152: string newpath=Path.Combine(Server.MapPath("Files"),Path.GetFileName(File1.PostedFile.FileName));


源文件: c:\inetpub\wwwroot\testweb\test.aspx.cs 行: 150

堆栈跟踪:


[NullReferenceException: 未将对象引用设置到对象的实例。]
TestWeb.test.ButtonUpload_Click(Object sender, EventArgs e) in c:\inetpub\wwwroot\testweb\test.aspx.cs:150
System.Web.UI.WebControls.Button.OnClick(EventArgs e)
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
System.Web.UI.Page.ProcessRequestMain() +1263


  • 打赏
  • 举报
回复
gj0001 2003-12-12
好同志
  • 打赏
  • 举报
回复
加载更多回复
相关推荐
发帖
.NET社区
加入

6.0w+

社区成员

.NET技术交流专区
帖子事件
创建了帖子
2003-12-12 10:39
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。