1

Gridview1 からレコードを削除すると同時に、対応する画像ファイルをサーバーからワンクリックで削除しようとしています。(Gridview1 の各行には、サーバー上の関連付けられたイメージ ファイルがあります)。

レコードを削除するには 、のステートメントasp:CommandField showDeleteButton="true"と一緒に使用しています。sqlDataSourceDELETE

そのプロセス中に、GridView1の " onRowDeleting" イベントを使用して、対応する画像ファイルをサーバーから削除しています。

以下にコードを示します。

  • レコードは実際に削除されます。
  • サーバー上のファイルはそうではありません。
  • スローされるエラーはありません (ファイルが見つからないと思いますが、これは予想される動作です)。

また、考慮してください: Gridviewで開発を開始する前に、はるかに簡単な「サーバーからファイルを実際に削除できるかどうかを確認する」テストをすでにセットアップしてテストしました。私たちのファイルはホスティング会社のサーバー上にあるため、権限の問題をテストしたかったのです。それによって: ファイル名と拡張子をテキスト ボックス ("myImage.jpg") に入力しますFile.Delete。WhaaLa メソッドを使用するボタンをクリックします。ファイルはサーバーから削除されます。

ただし、新しいセットアップでファイルを削除することはできません。コードは次のとおりです。

    <asp:GridView ID="GridView1" runat="server" AllowSorting="True"  AutoGenerateColumns="False" DataKeyNames="libraryID" 
                            DataSourceID="SqlDataSource1" Width="800px"  onrowdeleting="deleteImageFromServer" CssClass="gridViewSmallText" 
                              OnDataBound="rowCount">

                            <Columns>
                                <asp:CommandField ShowDeleteButton="True"  />

 <%--A link that goes to the uploadPage to upload a new version of the image--%>
              <asp:HyperLinkField runat="server" HeaderText="SKU (Click to Update)"  DataTextField="sku" DataNavigateUrlFields="sku" SortExpression="sku"  DataNavigateUrlFormatString="graphicUpload.aspx?sku={0}"  >
                   </asp:HyperLinkField>


                 <asp:TemplateField HeaderText="Image" SortExpression="imagePath">
                            <ItemTemplate>
<%--Pull the imagePath column from the database here-it also includes the image file --%>            
 <asp:Image ID="merchImage" runat="server" Height="100px" ImageUrl='<%# "http://www.ourcompanysite.net/" + DataBinder.Eval(Container.DataItem, "imagePath") %>' /><br />
    </ItemTemplate>
      </asp:TemplateField>
          <asp:TemplateField HeaderText="View Full Size">
      <ItemTemplate>
 <%--A link to view the image in it's full size in a new browser window--%>
  <asp:HyperLink ID="fullSizeHyperlink" runat="server" NavigateUrl='<%# "http://www.leadingjewelersguild.net/" + DataBinder.Eval(Container.DataItem, "imagePath") %>' Text="View" Target="_blank"  />
      </ItemTemplate>

 </asp:TemplateField>
<asp:BoundField DataField="DateUpdated" </asp:BoundField>
<%---some date stuff here--%>
 <asp:BoundField DataField="DateCreated" HeaderText="First Uploaded"    SortExpression="DateCreated" >
     </asp:BoundField>
          </Columns>
      </asp:GridView>

コードビハインド:

    protected void deleteImageFromServer(object sender, GridViewDeleteEventArgs e)

    {

  // I read from GridViewGuy.com that you're supposed to reference the row item via e.Values

  string imageToDelete = e.Values["sku"] + ".jpg"; 

   //I pulled the value of "imageToDelete" into a lable just to see what I was getting   
//during the "onRowDeleting" and it reported back .jpg instead of the full file name 
//myImage.jpg, so I guess this is the crux of my problem.


   string image = Server.MapPath("/images/graphicsLib/" + imageToDelete);
   string image = Server.MapPath("e:\\sites\\oursite\\files\\images\\graphicsLib\\" + imageToDelete);

    if (File.Exists(image))
       {
            File.Delete(image);
       }


//at this point the record from GridView1 is gone, but the file on server remains.
}
4

2 に答える 2

2

あなたの問題の一部はe.Values["sku"]、値を含めるために、最初にバインドする必要があるということかもしれないと思います。私はそのデータをバインドするとは思わないHyperlinkField(私はそれについて間違っている可能性があるので、私を引用しないでください)

まず<asp:BoundField DataField="sku" Visible="false" />、列リストにを追加してみてください。または、HyperLinkFieldをTemplateFieldに変更して、SKUを明示的にバインドします'<%#Bind("sku")%>'

それでも問題が解決しない場合は、に変更DataKeyNames="libraryID"して みてくださいDataKeyNames="libraryID,sku"e.Keys["sku"]、またはから値を取得できるはずですe.Values["sku"]

于 2009-10-24T00:17:29.530 に答える
0

GridViewコントロールを使用して開発を開始した後、そこにブレークポイントを設定して、deleteImageFromServerメソッドが呼び出されていることを確認しましたか?

そして、そのimageToDeleteは正しく設定されていますか?

侵入した後、「sender」と「e」の「watch」の値を確認します。それらにドリルダウンして、それらがどのような種類のオブジェクトであり、どのような値を保持しているかを確認します。

適切なオブジェクトに到達するために、GridViedコントロールのオブジェクト階層をトラバースする必要がある場合があります。

于 2009-10-24T00:00:15.873 に答える