Удалить запись из GridView и файл с сервера в один клик - PullRequest
1 голос
/ 24 октября 2009

Я пытаюсь удалить запись из Gridview1, одновременно удаляя соответствующий файл изображения с сервера в один клик. (Каждая строка в Gridview1 имеет связанный файл изображения на сервере.)

Для удаления записи я использую asp:CommandField showDeleteButton="true" вместе с оператором sqlDataSource * DELETE.

Во время этого процесса я также использую событие GridView1 "onRowDeleting" для удаления соответствующего файла изображения с сервера.

Вот что он делает с кодом, приведенным ниже:

  • Запись действительно удаляется,
  • файла на сервере нет,
  • Не выдается никаких ошибок (поскольку я предполагаю, что файл не найден, и это ожидаемое поведение).

Также рассмотрим: Я уже настроил и протестировал гораздо более простой ", чтобы увидеть, действительно ли файлы могут быть удалены с server " test, прежде чем я начал разработку на 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.
}

Ответы [ 2 ]

2 голосов
/ 24 октября 2009

Я думаю, что часть вашей проблемы может заключаться в том, что для того, чтобы 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"].

0 голосов
/ 24 октября 2009

После того, как вы начали разработку с использованием элемента управления GridView, вы убедились, что метод deleteImageFromServer вызывается, установив там точку останова?

И что imageToDelete устанавливается правильно?

После взлома посмотрите на значения 'watch' для 'sender' и 'e'. Детализируйте их, чтобы увидеть, что это за объекты и какие у них ценности.

Иногда вам нужно пройти иерархию объектов в элементе управления GridVied, чтобы добраться до нужного объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...