2013-09-27 29 views
0

我有一個與父網格的行在一對多關係上關聯的圖像的嵌套網格視圖。該結構包含在用戶控件中。這些圖像通過文件上傳控件上傳,並存儲在服務器上的文件夾中。當圖像網格的行被刪除時,我從OnRowDeleting事件中的服務器中刪除圖像。奇怪的是,當你刪除一行時,會發生回傳,並且OnRowDeleting事件觸發,記錄將從數據庫中刪除,但該行不會從UI中消失,直到您再次刪除它爲止。更令人沮喪的是,當我在OnRowDeleting事件中註釋掉代碼時,該行立即刪除。這裏發生了什麼?在OnRowDeleting事件後沒有(完全)刪除嵌套的gridview行

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="OrderItemView.ascx.cs" Inherits="Controls_OrderItemView" EnableTheming="true" EnableViewState="true"%> 

<asp:GridView ID="OrderItemList" runat="server" AutoGenerateColumns="False" 
    DataKeyNames="Id,ConcurrencyId" DataSourceID="OrderItemDataSource" 
    SkinID="Blue" OnRowDataBound="OrderItemList_RowDataBound" 
    EnableModelValidation="True" Width="100%" 
    OnRowUpdating="OrderItemList_RowUpdating" 
    OnRowUpdated="OrderItemList_RowUpdated" AllowSorting="True" > 
    <Columns> 
     <asp:TemplateField ShowHeader="False"> 
      <ItemTemplate> 
       <asp:ImageButton ID="ImageButtonConfirmDelete" runat="server" 
        CausesValidation="False" CommandName="Delete" ImageUrl="../Images/Grid_ActionDelete.gif" 
        OnClientClick='return confirm("Are you sure you want to delete this Order Item? This cannot be undone.");'/> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Item Name" SortExpression="OrderItemName"> 
      <ItemTemplate> 
       <asp:Label ID="Label2" runat="server" Text='<%# Bind("OrderItemName") %>'></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Images"> 
      <ItemTemplate> 
       <a href="" data-id='<%# Eval("id","imageHeader_{0}") %>' class="expandImages"> 
        <asp:Label ID="Label3" runat="server" 
         Text='<%# string.Format("{0} Image{1}", Helpers.GetImageCount(new Guid(Eval("Id").ToString())), Helpers.GetImageCount(new Guid(Eval("Id").ToString())) != 1 ? "s" : "") %>'> 
        </asp:Label> 
       </a> 
       <div id='<%# Eval("id","images_{0}") %>' class="imageDisplay"> 
        <asp:GridView ID="gvImages" runat="server" SkinID="Blue" 
         DataKeyNames="Id" EnableModelValidation="True" 
         DataSourceID="ImageDataSource" AutoGenerateColumns="False" 
         ShowHeader="False" onrowdeleting="gvImages_RowDeleting"> 
         <Columns> 
          <asp:TemplateField ShowHeader="false"> 
           <ItemTemplate> 
            <asp:ImageButton ID="ImageButtonConfirmDeleteImage" runat="server" 
             CausesValidation="False" CommandName="Delete" ImageUrl="../Images/Grid_ActionDelete.gif"/> 
           </ItemTemplate> 
          </asp:TemplateField> 
          <asp:TemplateField ShowHeader="false"> 
           <EditItemTemplate> 
            <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("FileName") %>'></asp:TextBox> 
           </EditItemTemplate> 
           <ItemTemplate> 
            <a href="" data-id='<%# Eval("id","image_{0}") %>' onclick='showImage("<%# Eval("ImageUrl") %>"); return false;'> 
             <asp:Label ID="Label1" runat="server" Text='<%# Bind("FileName") %>' ToolTip="Click to Preview Image"></asp:Label> 
            </a> 
           </ItemTemplate> 
          </asp:TemplateField> 
         </Columns> 
         <EmptyDataTemplate> 
          <div style="color: Blue; font-style: italic;">No Images</div> 
         </EmptyDataTemplate> 
        </asp:GridView> 
        <asp:FileUpload ID="FileUpload1" runat="server"/> 
        <asp:Button ID="btnUploadImage" runat="server" Text="Upload" CommandArgument='<%# Eval("Id") %>' 
         CommandName="orderItemId" oncommand="btnUploadImage_Command"/> 
        <asp:ObjectDataSource ID="ImageDataSource" runat="server" 
         DataObjectTypeName="OrderSite.Entities.OrderItemImage" 
         DeleteMethod="Delete" InsertMethod="Save" 
         OldValuesParameterFormatString="original_{0}" SelectMethod="GetList" 
         TypeName="OrderSite.Bll.OrderItemImageManager" UpdateMethod="Save" 
         SelectCountMethod="SelectCountForGetList"> 
         <SelectParameters> 
          <asp:Parameter DbType="Guid" Name="orderItemId"/> 
         </SelectParameters> 
        </asp:ObjectDataSource> 
       </div> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
    <EmptyDataTemplate> 
     <div style="padding: 3px 0 3px 3px 3px;">No Order Items Exist</div> 
    </EmptyDataTemplate> 
</asp:GridView> 
<asp:ObjectDataSource ID="OrderItemDataSource" runat="server" 
    DataObjectTypeName="OrderSite.Entities.OrderItem" 
    DeleteMethod="Delete" InsertMethod="Save" 
    OldValuesParameterFormatString="original_{0}" SelectMethod="GetList" 
    TypeName="OrderSite.Bll.OrderItemManager" UpdateMethod="Save" 
    OnInserting="OrderItemDataSource_OnInserting" 
    SortParameterName="sortExpression" SelectCountMethod="SelectCountForGetList"> 
    <SelectParameters> 
     <asp:Parameter DbType="Guid" Name="orderFormId" /> 
     <asp:Parameter Name="sortExpression" Type="String" /> 
    </SelectParameters> 
</asp:ObjectDataSource> 

我在父頁面註釋掉任何包含的UpdatePanel,因爲他們可以永遠是罪魁禍首,但沒有效果。

這裏是OnRowDeleting事件:

protected void gvImages_RowDeleting(object sender, GridViewDeleteEventArgs e) 
{ 
    // Also delete the file from the images folder 
    OrderItemImage myImage = OrderItemImageManager.GetItem((Guid)e.Keys["Id"]); 
    if (myImage != null) 
    { 
     string path = string.Format("../Images/OrderItemImages/{0}", myImage.OrderItemId.ToString()); 
     if (File.Exists(Server.MapPath(string.Format("{0}/{1}", path, myImage.FileName)))) 
     { 
      File.Delete(Server.MapPath(string.Format("{0}/{1}", path, myImage.FileName))); 
      // if there are no images left in folder, then delete it (only deletes empty directory) 
      if (Directory.GetFiles(Server.MapPath(path), "*.*", SearchOption.TopDirectoryOnly).Length == 0) 
       Directory.Delete(Server.MapPath(path)); 
     } 
     OrderItemList.DataBind(); 
    } 
} 

我在此之前已經做了,暫時還沒有問題,所以任何幫助將不勝感激!

回答

0

我最終在用戶控件中包裝了嵌套的GridView(「gvImages」),FileUpload和Button,現在它工作的很好。我沒有改變任何代碼,只是把它全部包裝在用戶控件中,所以去圖。