Msgbox gridview

martedì 21 ottobre 2008 - 15.25

bolla111 Profilo | Senior Member

ciao a tutti
vorrei fare una cancellazione di un record di un gridview...però prima di eliminare la riga vorrei far comparire un msgbox che ti chieda la conferma o meno...
ho aggiunto la colonna "elimina": <asp:CommandField ShowDeleteButton="True" ShowHeader="True"/>
ed ora come la gestisco?

rossimarko Profilo | Guru

Ciao,

hai due possibilità:
- crei una colonna ti tipo template con un linkbutton e inserisci nell'onclientclick o da codice la funzione javascript:http://www.codeproject.com/KB/webforms/GridViewConfirmDelete.aspx
- tieni la colonna CommandField e da codice inserisci il javascript di conferma: http://www.codeproject.com/KB/aspnet/Confirm_Delete.aspx
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

bolla111 Profilo | Senior Member

ci sto provando ma non conosco una cippa di javascript
cmq sto provando ad adattare il codice in vb
mi da un po di errori... potresti spiegarmi brevemente quello che fa? così forse riesco a risolvere...
grazie

rossimarko Profilo | Guru

quale esempio stai guardando? così ti do qualche informazione in più...
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

bolla111 Profilo | Senior Member

il secondo...ho tenuto la colonna command field...
dici che è + semplice il primo? xkè x me è importante capire cosa faccio...

rossimarko Profilo | Guru

>il secondo...ho tenuto la colonna command field...
>dici che è + semplice il primo? xkè x me è importante capire
>cosa faccio...

Per capire è meglio valutare il primo esempio.. Comunque il ragionamento alla base è lo stesso, cerco di spiegartelo con un piccolo esempio. Innanzitutto considera che per inserire una conferma alla pressione di un pulsante si deve usare javascript. Più precisamente si deve inserire nell'attributo onclick del bottone html la chiamata ad una funzione. Se la chiamata ritorna true viene fatto il post, altrimenti viene bloccato. Nei controlli Button e LinkButton questa funzione può essere inserita all'interno della proprietà OnClientClick, e per farlo si può sfruttare la funzione javascript window.confirm che ritorna true o false a seconda che l'utente prema ok o annulla

Esempio:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Questo ragionamento si può applicare anche alla gridview, inserendo una colonna template con un button o un linkbutton. L'unica cosa da aggiungere è il campo CommandName. Come si può leggere dalla documentazione il commandName per generare l'evento di delete della griglia è "Delete". Detto questo puoi inserire una template column come quella che segue e vedrai il messaggio di conferma:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Nei due esempi che ti ho riportato la funzione javascript veniva inserita da codice nell'evento rowdatabound, ma il funzionamento è analogo. Viene preso il riferimento al linkbutton o al datacommandfield e poi da codice viene inserito l'attributo onclick

Spero di averti chiarito un po' le idee altrimenti chiedi pure..

-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

bolla111 Profilo | Senior Member

all'inizio avevo pensare di gestire da codice un msgbox che mi chiedeva se continuare o meno...però ora provo così

quindi ora al mio markup ho inserito questo:

<asp:TemplateField>
<ItemTemplate>
<asp:LinkButton ID="btnDelete" runat="server" CommandName="Delete" OnClientClick="return window.confirm('Eliminare il record?');" Text="Elimina" />
</ItemTemplate>
</asp:TemplateField>

ora devo gestire il codice...

rossimarko Profilo | Guru

Il passo successivo dipende da come hai impostato il datasource. Se hai usato un datasource asp.net (SqlDataSource piuttosto che ObjectDataSource) e hai impostato un datasourceID sulla gridview allora dovrai abilitare la delete sul tuo datasource. In questo articolo ci sono alcuni esempi: http://msdn.microsoft.com/en-us/library/ms972940.aspx

Se invece hai impostato il datasource da codice
grid.DataSource = xx; grid.DataBind();
l'unica cosa che ti manca adesso è implementare l'evento rowdeleting per fare la cancellazione:

void grid_RowDeleting(object sender, GridViewDeleteEventArgs e) { int id = Convert.ToInt32(grid.DataKeys[e.RowIndex].Value); //cancellazione }

L'id viene prelevato dalla colonna impostata nella proprietà DataKeyNames del gridview
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

bolla111 Profilo | Senior Member

no...non ci sono
allora...1 cosa x volta
non ho ancora creato codice...cmq
provo a schiacciare il mio link elimina e mi esce la pagina di errore con scritto che non conosce il mio campo chiave
non posso passarglielo tramite datanavigate o qlcs di simile?
se non esiste vuol dire che devo farlo x forza da codice...ma quello che mi hai passato te nel post precedente non riesco a convertirlo in vb...
puoi aiutarmi?

rossimarko Profilo | Guru

>provo a schiacciare il mio link elimina e mi esce la pagina di
>errore con scritto che non conosce il mio campo chiave
>non posso passarglielo tramite datanavigate o qlcs di simile?

Il campo chiave lo puoi impostare con la proprietà DataKeyNames che puoi mettere direttamente nella pagina aspx
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

>quello che mi hai passato te nel post precedente non riesco a
>convertirlo in vb...
>puoi aiutarmi?

Se NON usi un DatasourceID allora devi agganciare l'evento RowDeletegin, questa è la funzione convertita in VB:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Altrimenti devi aggiungere al tuo datasource un deletecommand o il nome della funzione di delete e poi verrà gestito in automatico.
Tu quale delle due soluzioni usi?

-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

bolla111 Profilo | Senior Member

io uso un datasourceid nel gridview...il suo valore è: "sqldatasource1"
nel mio sqldatasource1 io ho impostato (oltre alla select) anche il deletecommand="DELETE FROM ESTASKASS WHERE TAID=@TAID AND TAIDIN=@TAIDIN"
però come fa a riconoscere @taid e @taidin? come glieli passo? o come faccio a dirgli di cancellarmi la riga della quale ho premuto "elimina"?

rossimarko Profilo | Guru

>io uso un datasourceid nel gridview...il suo valore è: "sqldatasource1"
>nel mio sqldatasource1 io ho impostato (oltre alla select) anche
>il deletecommand="DELETE FROM ESTASKASS WHERE TAID=@TAID AND
>TAIDIN=@TAIDIN"
>però come fa a riconoscere @taid e @taidin? come glieli passo?
>o come faccio a dirgli di cancellarmi la riga della quale ho
>premuto "elimina"?

Ciao, se hai usato un sql datasource allora ci pensa lui. Ovviamente devi indicargli qual'è la chiave primaria attraverso la DataKeyNames.
In questo articolo spiega bene la procedura con alcune schermate: http://msdn.microsoft.com/en-us/library/ms972940.aspx
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

bolla111 Profilo | Senior Member

ok...nuovo errore: L'istruzione DELETE è in conflitto con il vincolo REFERENCE "FK_BLA BLA BLA". Il conflitto si è verificato nella tabella "dbo.BLA BLA BLA" del database "BLA BLA BLA".
nel mio database ho anche un'altra tabella la cui chiave è formata da 3 campi (2 dei quali sono anche gli stessi campi che sono chiave primaria di questa tabella)
come risolvo questo errore? (se è proprio questo il fatto perchè non sono convinto che le mie istruzioni siano giuste)
grazie
ciao

rossimarko Profilo | Guru

In questo caso il problema è che prima devi cancellare i dati nell'altra tabella, altrimenti ti viene giustamente segnalata una violazione della foreign key. Se ritieni che sia giusto cancellare in automatico anche i dati della tabella correlata allora nelle proprietà della foreign key puoi impostare il cascade delete (cancellazione automatica degli elementi figlio).. Però poi bisogna stare attenti
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

bolla111 Profilo | Senior Member

ah...è una cosa che non ho mai fatto (come se fosse l'unica )... me la spieghi?
oppure posso fare una query in cui riesco a cancellare i record di entrambe le tabelle?

rossimarko Profilo | Guru

Che database stai usando?
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

bolla111 Profilo | Senior Member

ms sqlserver...grazie x la pazienza cmq

rossimarko Profilo | Guru

Allora se usi sql server ti consiglio di creare una stored procedure (http://programmazione.html.it/guide/lezione/2080/le-stored-procedure/).

In questa stored procedure puoi fare una piccola transazione che cancella prima i dati della tabella figlia e poi quelli del record che stai passando. In pratica la tua stored procedure riceverà due parametri che sono la chiave identificativa e poi si occupa di fare la cancellazione. Ti faccio un piccolo esempio prendendo come spunto la query che avevi mandato:

Stored Procedure (come presupposto ho considerato le due colonne di tipo int, se non è così devi cambiarle):
CREATE PROCEDURE proc_ESTASKASS_Delete @TAID int, @TAIDIN int AS BEGIN SET XACT_ABORT ON SET NOCOUNT ON BEGIN TRAN -- Cancellazione tabella figlio DELETE FROM TabellaFiglio WHERE TAID=@TAID AND TAIDIN=@TAIDIN -- Cancellazione tabella padre DELETE FROM ESTASKASS WHERE TAID=@TAID AND TAIDIN=@TAIDIN COMMIT TRAN END

Il datasource dovrà essere modificato con questi parametri:
DeleteCommand="proc_ESTASKASS_Delete" DeleteCommandType="StoredProcedure"

E come parametri:
<DeleteParameters>
<asp:Parameter Name="TAID" Type="Int32" />
<asp:Parameter Name="TAIDIN" Type="Int32" />
</DeleteParameters>

Così facendo eviti di inserire i cascade delete (nel caso ti sbagliassi a cancellare un record su db sql non ti bloccherebbe più)


-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

bolla111 Profilo | Senior Member

ok tutto apposto grazie...
vedo che 6 stra in gamba...
cmq avrei ancora una domanda da farti...te la faccio qui? perchè cmq ho già aperto un thread...è ancora uno degli ultimi...

rossimarko Profilo | Guru

>ok tutto apposto grazie...
>vedo che 6 stra in gamba...
>cmq avrei ancora una domanda da farti...te la faccio qui? perchè
>cmq ho già aperto un thread...è ancora uno degli ultimi...

Se non riguarda questo argomento sarebbe meglio chiuderlo (basta accettare una risposta) e poi aprire un'altro thread, altrimenti accoda pure
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

bolla111 Profilo | Senior Member

l'altro thread l'ho già fatto...questo lo chiudo...ho appena scritto un mex in quel thread
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5