galeria w gridivew / usuwanie pliku

0

Hej.
Zrobiłem galerię w gridview, ale mam problem ze zrobieniem usuwania. Jak na razie mam usuwanie wierszy z bazy danych, ale nie wiem zbytnio jak zrobić usuwanie pliku z dysku.

Tak wygląda mój Gridview

 <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
        DataKeyNames="pic_id" DataSourceID="SqlDataSource2">
        <Columns>
            <asp:BoundField DataField="pic_id" HeaderText="pic_id" InsertVisible="False" 
                ReadOnly="True" SortExpression="pic_id" />
            <asp:TemplateField HeaderText="image" SortExpression="url">
                <EditItemTemplate>
                    <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("url") %>'></asp:TextBox>
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:Image ID="Image2" runat="server" ImageUrl='<%# Eval("url", "~/images/{0}") %>' Height="70px" Width="70px" />  
                    
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Delete"><ItemTemplate><asp:LinkButton ID="LinkButton1" Runat="server"
            OnClientClick="return confirm('Are you sure?');" OnClick="Link_Click"
                CommandName="Delete">Delete</asp:LinkButton></ItemTemplate></asp:TemplateField>
        </Columns>
    </asp:GridView>

Jak na razie doszedłem do tego żeby Link_Click łapał numer wiersza w Gridview, ale nie wiem czy to dobra droga.

 protected void Link_Click(object sender, EventArgs e)
        {
            GridViewRow gvRow = (GridViewRow)(sender as Control).Parent.Parent;
            int index = gvRow.RowIndex;
            Label2.Text = index.ToString();
            
        }

Jakieś pomysły? :/

1

string physicalPath = Server.MapPath("~/images/someImage1.gif");
System.IO.File.Delete(physicalPath);

0

Dzięki za szybką odpowiedź.
Fajnie działa tylko mam problem z nazwą obrazka. Nazwy obrazków są zapisywane do kolumny w bazie danych, a przechowywane są fizycznie w katalogu.
Jak pobrać właściwą nazwę obrazka z bazy danych gdy klikniemy na delete w gridview?

1

No napisałem ci. Musisz użyć MapPath, żeby ścieżkę logiczną obrazka przekształcić na fizyczną i wtedy można usunąć za pomocą Delete.
Jak kliknięte będzie delete w danym row, to masz informację w którym

Zamiast obsługiwać onclick linku i przez parent.parent dochodzić jaki row kliknięty lepiej tak:

<ItemTemplate>
       <asp:LinkButton ID="LinkButton1" CommandArgument='<%# Eval("Id") %>'  CommandName="Delete" runat="server" onClientClick="return confirm('Czy na pewno chcesz usunąć obrazek?');">Delete</asp:LinkButton>
     </ItemTemplate>

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
  if (e.CommandName == "Delete")
  {
    int rowId = Convert.ToInt32(e.CommandArgument);
    string imagePath = GetImageForRow(rowId);
    string physicalPath = Server.MapPath(imagePath);
  //lub
    string physicalPath = Server.MapPath("~/images/" + imagePath); //zależy co w bazie trzymasz
    System.IO.File.Delete(physicalPath);
  }
}

oczywiście try-catch należałoby dodać przynajmniej na delete

0

Dzięki za odpowiedź.

Możesz mi wytłumaczyć "GetImageForRow"? Bo Visualowi to nie pasuje zbytnio, google też nic nie mówi na ten temat.

Z góry dzięki.

1

Jeśli jako source grida masz sqldatasource (tak to coś z designera co się wyklikuje się chyba nazywa) i ustawione DataKeyNames (czy jakoś tak), to możesz:

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
  if (e.CommandName == "Delete")
  {
    // jako CommandArgument wskazujesz klucz wiersza
    DataRow row = myGrid.Keys[e.CommandArgument] as DataRow; // sprawdź czy to na prawdę jest DataRow, bo ja już nie pamiętam
    if (row != null)
      row["ImagePath"]; // nie wiem jak się twoja kolumna ze ścieżką nazywa
  }
}
0

Dzięki massther za pomoc.

Niestety poszedłem na około, bo miałem dosyć bawienia się bez wielkich rezultatów. Pomógł sql command ;-) wklejam kod

  protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {

            SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings[1].ToString());
            string id = GridView1.Rows[e.RowIndex].Cells[0].Text;
            string id2=id.ToString();
            con.Open();
            SqlCommand command = new SqlCommand("select url from Gallery where pic_id=" + id2, con);
            SqlDataAdapter adapter = new SqlDataAdapter(command);
            DataSet ds = new DataSet();
            adapter.Fill(ds);
            string p_name = ds.Tables[0].Rows[0][0].ToString();
            con.Close();
            string filePath = Server.MapPath("~/images/" + p_name);
            File.Delete(filePath);
        } 
1

lo matko, ale po co ci ten sqldataadapter?

zamiast:
SqlDataAdapter adapter = new SqlDataAdapter(command);
DataSet ds = new DataSet();
adapter.Fill(ds);
string p_name = ds.Tables[0].Rows[0][0].ToString();

użyj:
string p_name = (string)command.ExecuteScalar();

1 użytkowników online, w tym zalogowanych: 0, gości: 1