40 messaggi dal 01 ottobre 2010
Ciao,

ho una gridview dove faccio visualizzare tutte le immagini presenti sul sito, in essa è attiva l'eliminazione, però se l'utente clicca su elimina, ovviamente, l'azione viene eseguita solo sul DB ma non sulla cartella nello spazio web dove sono custodite le immagini.
Come posso implementare una funzione che al click sull'elimina della gridview da parte dell'utente, oltre all'eliminazione del dato dal DB, azioni anche l'eliminazione dell'immagine dalla cartella? nella tabella del DB ho un id univoco, il path e il nome.
Spero che qualcuno possa essermi di aiuto, buona serata.
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,
sottoscrivi l'evento RowDeleting (o RowDeleted) del GridView, così avrai l'opportunità di eseguire il codice per la rimozione del file.

Aggiungi l'attributo "OnRowDeleting" al GridView.
<asp:GridView OnRowDeleting="rowDeleting" runat="server">
 ...
</asp:GridView>


Ora aggiungi la funzione nel tuo codefile:
public void rowDeleting(object sender, GridViewDeleteEventArgs e)
{
  //in base al valore di path e nome (o di altri campi), componi il percorso del file
  var path = e.Values["path"].ToString();
  var nome = e.Values["nome"].ToString();
  var percorsoFile = Server.MapPath("~/" + path + nome);
  //e qui cancellalo
  if (File.Exists(percorsoFile))
    File.Delete(percorsoFile)
}

Io in questo esempio ho dato per scontato che path e nome fossero campi presenti nella collezione e.Values ma se così non fosse devi andarteli a recuperare dal DB. Tieni presente che, all'evento RowDeleting, il record non è stato ancora rimosso quindi troverai tutti i dati ancora intatti.

ciao
Modificato da BrightSoul il 29 giugno 2012 23.48 -

Enjoy learning and just keep making
Inoltre, aggiungo a quanto gia detto da Bright, che l'evento di cancellazione del record dev'essere fatto dopo l'eliminazione dell'imagine, in questo modo non avrai mai dei record che non puntano a nulla.

E' una buona usanza verificare l'effettiva cancellazione dell'immagina con un if, e se il risultato è true procedere con l'eliminazione del record, altrimenti mostrare un messaggio. Ti consiglio inoltre di gestire il tutto con il costrutto try/catch...

Scrivi se hai ancora bisogno.

Creazione Siti Vicenza
Posizionamento Siti - SEO
40 messaggi dal 01 ottobre 2010
grazie per l'aiuto, sto cercando di seguire le vostre istruzioni ma non riesco ad eliminare l'immagine, questa è la mia gridview

<asp:GridView ID="GridView2" OnRowDeleting="rowDeleting" runat="server" AutoGenerateColumns="False" 
        DataKeyNames="ID" DataSourceID="SqlDataSource2" CellPadding="8" 
        AllowPaging="True" PageSize ="20" >
        <Columns>

            <asp:BoundField DataField="ID" HeaderText="ID" ReadOnly="True" 
                SortExpression="ID" Visible="false" />            

            <asp:BoundField DataField="nome" HeaderText="nome" SortExpression="nome" />

            <asp:ImageField DataImageUrlField="nome" DataImageUrlFormatString="~\images\caricate\{0}"
                AlternateText="Caricamento immagine" NullDisplayText="No image on file." HeaderText="Immagine" 
                ReadOnly="true" ControlStyle-Width="100">            
            <ControlStyle Width="100px"></ControlStyle>
            </asp:ImageField>
           
            <asp:TemplateField ShowHeader="False">
                <ItemTemplate>
                <asp:LinkButton ID="LinkButton1" runat="server" HeaderText="Elimina"
                 CausesValidation="False" CommandName="Delete" Text=""
                 OnClientClick="if(!confirm('Vuoi eliminare questa immagine?')) return false;">
                 <img src='~/images/caricate/cestino.png' alt="Elimina" />
                </asp:LinkButton>
                </ItemTemplate>
            </asp:TemplateField>

        </Columns>
    </asp:GridView>        
    <br /><br /><br /><br />
    
    <asp:SqlDataSource ID="SqlDataSource2" runat="server"
    ConnectionString="<%$ ConnectionStrings:MiaConnectionString %>" 
        SelectCommand="SELECT * FROM [immagini]        
                        ORDER BY ID DESC" 
        DeleteCommand="DELETE FROM IMMAGINI WHERE (ID = @ID)">
        <DeleteParameters>
            <asp:Parameter Name="ID" />
        </DeleteParameters>        
    </asp:SqlDataSource>

nel relativo file di codice ho inserito l'evento rowDeleting così
public void rowDeleting(object sender, GridViewDeleteEventArgs e)
{
  
    var path = "~/images/caricate/";
  var nome = e.Values["nome"].ToString();
  var percorsoFile = Server.MapPath(path + nome);
 
  if (File.Exists(percorsoFile))
    File.Delete(percorsoFile);
}

Ora se provo ad eliminare un'immagine mi esegue il DeleteCommand, ma non l'evento rowDeleting, infatti mi cancella il record dal DB ma l'immagine fisica rimane nella cartella, dove sbaglio?
se metti un breakpoint passa da rowDeleting?
Ps - ovviamente la cartella delle immagini deve avere i permessi di scrittura e cancellazione per l'utente del tuo app pool

Ormai programmano tutti... ma la professionalità appartiene a pochi
40 messaggi dal 01 ottobre 2010
grazie Manuel, sbagliavo a costruire il percorso del path del file, adesso funziona! IN LOCALE
su Aruba invece come prevedevo mi dice Access to the path 'D:\Inetpub\webs\ecc\images\modifica1.png' is denied.
da FileZilla ho provato a dare i permessi su questa cartella ma sembra non cambiare nulla, qualcuno di voi sa come abilitare questi permessi?
311 messaggi dal 08 gennaio 2011
Se l'eliminazione è consentita a tutti potresti spostare le immagini in una sottocartella della cartella public di Aruba.

Ciao.
Modificato da marioformosa il 18 luglio 2012 16.18 -
40 messaggi dal 01 ottobre 2010
Grazie ho risolto, sono andato nel pannello di controllo di Aruba, all'interno c'è una sessione chiamata "permission manager" da li ho potuto impostare i permessi alle cartelle interessate. Ciao!

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.