比如这个 ,我们在新建数据的时候,要求上传一张图片
<asp:FormView ID="FormView1" runat="server" DataKeyNames="id" DataSourceID="SqlDataSource1">
<InsertItemTemplate>
title:
<asp:TextBox ID="titleTextBox" runat="server" Text='<%# Bind("title") %>'>
</asp:TextBox><br />
<asp:FileUpload ID="FileUpload1" runat="server" />
<asp:LinkButton ID="InsertButton" runat="server" CausesValidation="True" CommandName="Insert"
Text="插入">
</asp:LinkButton>
<asp:LinkButton ID="InsertCancelButton" runat="server" CausesValidation="False" CommandName="Cancel"
Text="取消">
</asp:LinkButton>
</InsertItemTemplate>
</asp:FormView>
然后,我们在里面放上一个FileUpload ,ID为FileUpload1
要求点插入的时候,自动把你要求上传的文件上传服务器,并且把上传的文件名存储到数据库中。这个很多人在ASP都会,但是在.NET中可能就不顺手了, 下面我給大家简单演示一下,如何实现这个功能。既然我们要求在插入的时候上传,并且保存,那么我们首先写一个插入前的事件。
OnItemInserting="FormView1_ItemInserting"
protected void FormView1_ItemInserting(object sender, FormViewInsertEventArgs e)
{
FormView fv = (FormView)sender;
FileUpload FU_Gate = (FileUpload)fv.FindControl("FileUpload1");
}
OK,这样写,就可以取得你FormView组件内的,FileUpload1组件, 具体原理是,使用 FindControl 进行查找。
找到后的组件赋给FU_Gate,这样我们就可以对 FU_Gate 操作进行上传, 编写一个上传代码:
protected string Up(FileUpload UpFile)
{
string UpUrl = Server.MapPath(ConfigurationManager.AppSettings["UpFileUrl"] + "AD_Click/");
string FileName="Non.gif";
if (UpFile.HasFile)
{
String fileExtension = System.IO.Path.GetExtension(UpFile.FileName).ToLower();
String[] allowedExtensions = { ".gif", ".png", ".jpeg", ".jpg", ".bmp" };
for (int i = 0; i < allowedExtensions.Length; i++)
{
if (fileExtension == allowedExtensions[i])
{
FileName = "ABCD" + fileExtension;
UpFile.SaveAs(UpUrl + FileName);
}
}
}
return FileName;
}
上面的方法是传递一个 FileUpload 类型,然后,进行上传,并将上传后的文件名称返回。
然后 继续在FormView1_ItemInserting编写代码
protected void FormView1_ItemInserting(object sender, FormViewInsertEventArgs e)
{
FormView fv = (FormView)sender;
FileUpload FU_Gate = (FileUpload)fv.FindControl("FileUpload1");
e.Values["pic"] = Up(FU_Gate);// 这个 PIC 表示要储存上传图片文件名称的字段
}
OK,简单的上传过程完成了.
然后再来
这个是新建,如果更新呢,更新的话,如果还这样 写,呢如果你再更改标题或者别的字段的时候,并没有选择上传图片,呢样会自动把这个值清空,效果我们肯定不满意!!
这样我们简单写一个隐藏组件来保存之前的文件名
<EditItemTemplate>
<asp:TextBox ID="titleTextBox" runat="server" Text='<%# Bind("title") %>'></asp:TextBox>
<asp:FileUpload ID="FileUpload1" runat="server" /><asp:HiddenField ID="PicName" Value='<%# Bind("pic") %>' runat="server" />
<asp:LinkButton ID="UpdateButton" runat="server" CausesValidation="True" CommandName="Update"
Text="更新">
</asp:LinkButton>
<asp:LinkButton ID="UpdateCancelButton" runat="server" CausesValidation="False" CommandName="Cancel"
Text="取消">
</asp:LinkButton>
</EditItemTemplate>
<asp:HiddenField ID="PicName" Value='<%# Bind("pic") %>' runat="server" />
这个就是之前说的用来存放数据的东东
编写事件:
protected void FormView1_ItemUpdating(object sender, FormViewInsertEventArgs e)
{
FormView fv = (FormView)sender;
FileUpload FU_Gate = (FileUpload)fv.FindControl("FileUpload1");
e.Values["pic"] = Up(FU_Gate);
}
protected void FormView1_ItemUpdating(object sender, FormViewInsertEventArgs e)
{
FormView fv = (FormView)sender;
FileUpload FU_Gate = (FileUpload)fv.FindControl("FileUpload1");
//e.Values["pic"] = Up(FU_Gate);
string UpName=Up(FU_Gate);
if (UpName != "Non.gif")
{
e.NewValues["pic"] = UpName;
}
}
这样写才对
因为之前的UP中制定,如果说,你没有上传文件,自动返回 Non.gif ,所以就判断一下。
OK,这个例子到此为止,补充几点:
FormView fv = (FormView)sender;
FileUpload FU_Gate = (FileUpload)fv.FindControl("FileUpload1");
可以写成
FileUpload FU_Gate = (FileUpload)FormView1.FindControl("FileUpload1");
还有就是,FormView只显示单条记录,GridView 则显示多条记录,在使用GridView 的时候用
FileUpload FU_Gate = (FileUpload)GridView1.FindControl("FileUpload1"); 可能无效,必须这样写!
GridView GV = (GridView)sender;
GridViewRow GVR = GV.Rows[e.RowIndex];// 表示当前选择的记录
FileUpload FU_Img = (FileUpload)GVR.Cells[1].FindControl("FileUpload1");//Cells[1] 表示这个控件所在列