0

1対多の関係で親グリッドの行に関連付けられている画像のネストされたグリッドビューがあります。この構造体は、ユーザー コントロールに含まれています。画像は fileupload コントロールでアップロードされ、サーバー上のフォルダーに保存されます。画像グリッドの行が削除されると、OnRowDeleting イベントでサーバーから画像を削除します。奇妙なことに、行を削除すると、ポストバックが発生して OnRowDeleting イベントが発生し、レコードはデータベースから削除されますが、2 回目に削除するまで行は UI から消えません。さらに奇妙なのは、OnRowDeleting イベントのコードをコメント アウトすると、行がすぐに削除されることです。何が起きてる?

<%@ 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>

親ページに含まれる更新パネルは常に原因になる可能性があるため、コメントアウトしましたが、効果はありませんでした。

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();
    }
}

私は以前にこれを行ったことがあり、問題はなかったので、どんな助けも大歓迎です!

4

1 に答える 1

0

ネストされた GridView ("gvImages")、FileUpload、および Button をユーザー コントロールにラップすることになりましたが、今ではうまく機能しています。コードは一切変更せず、すべてをユーザー コントロールにラップしただけです。

于 2013-10-06T15:47:32.287 に答える