Fileupload inside detailsview in edit mode
Hello i try to add a fileupload inside of a detailsview i attach here some parts from my code:
<asp:DetailsView ID="DetailsView1" runat="server" Height="50px" Width="586px"
DefaultMode="Edit" AutoGenerateRows="False" BorderColor="White"
BorderStyle="None" DataSourceID="EntityDataSource1" GridLines="None" DataKeyNames="UserName" OnItemUpdated="DetailsView1_ItemUpdated" ONItemEditing="DetailsView1_ItemEditing">
then the fileupload control is placed inside of template field:
<asp:TemplateField HeaderText="Foto">
<EditItemTemplate>
<asp:FileUpload ID="FileUpload1" runat="server" />
</EditItemTemplate>
</asp:TemplateField>
and the datasource is :
<asp:EntityDataSource ID="EntityDataSource1" runat="server"
ConnectionString="name=mesteriEntities" DefaultContainerName="mesteriEntities"
EnableFlattening="False" EntitySetName="Users"
EnableUpdate="True" AutoGenerateWhereClause="True"
EnableInsert="True">
<WhereParameters>
<asp:SessionParameter Name="UserName" SessionField="New" Type="String" />
</WhereParameters>
</asp:EntityDataSource>
The code behind:
protect开发者_StackOverflow中文版ed void DetailsView1_ItemEditing(object sender, DetailsViewInsertEventArgs e)
{
FileUpload fu1 = (FileUpload)DetailsView1.FindControl("FileUpload1");
if (fu1 == null)
e.Cancel = true;
if (fu1.HasFile)
{
try
{
string fileName = Guid.NewGuid().ToString();
string virtualFolder = "~/UserPics/";
string physicalFolder = Server.MapPath(virtualFolder);
// StatusLabel.Text = "Upload status: File uploaded!";
string extension = System.IO.Path.GetExtension(fu1.FileName);
fu1.SaveAs(System.IO.Path.Combine(physicalFolder, fileName + extension));
e.Values["foto"] = System.IO.Path.Combine(physicalFolder, fileName + extension);
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
}
else
e.Cancel = true;
}
I'm not sure why doesn't work. It doesn't upload the file on the server and doesn't add reference inside database of the file . Whay i did wrong here?
thank you
As far as I can tell (from looking at the class documentation: DetailsView Class) there is no OnItemEditing event to handle?
There is however a DetailsView.ItemUpdating event which looks like it could do the trick:
Occurs when an Update button within a DetailsView control is clicked, but before the update operation.
Also I think the FileUpload control cannot be found because the FindControl method is not searching the full hierarchy of controls it contains.
Try using the following method and modifying your code like so:
FileUpload fu1 = (FileUpload)FindControl(DetailsView1, "FileUpload1");
...
private Control FindControl(Control parent, string id)
{
foreach (Control child in parent.Controls)
{
string childId = string.Empty;
if (child.ID != null)
{
childId = child.ID;
}
if (childId.ToLower() == id.ToLower())
{
return child;
}
else
{
if (child.HasControls())
{
Control response = FindControl(child, id);
if (response != null)
return response;
}
}
}
return null;
}
精彩评论