GGridView con chechkbox per eliminare

venerdì 10 giugno 2011 - 13.10
Tag Elenco Tags  C#  |  .NET 4.0  |  Windows XP  |  Visual Studio 2010  |  SQL Server 2008 R2

Romanaderoma Profilo | Newbie

Ciao a tutti,
dovrei realizzare una GridView con un elenco di Computer presenti in un aula. Su ciascuna riga, però, deve essere presente una checkbox in modo da selezionare il computer. Lo scopo è fare in modo che alla pressione di un bottone, tutti i computer selezionati (attraverso le checkbox) vengano cancellati. Qual'è la soluzione migliore ?
Grazie mille.

alx_81 Profilo | Guru

>Ciao a tutti,
Ciao

>dovrei realizzare una GridView con un elenco di Computer presenti
>in un aula. Su ciascuna riga, però, deve essere presente una
>checkbox in modo da selezionare il computer. Lo scopo è fare
>in modo che alla pressione di un bottone, tutti i computer selezionati
>(attraverso le checkbox) vengano cancellati. Qual'è la soluzione migliore ?
A mio avviso, alla pressione del tasto "DELETE" ipotetico andrei a scorrere sulla griglia, ricavando gli id legati a tutte le righe selezionate.
Una volta che hai gli id, li potersti mettere in un datatable per poi passare questo datatable ad una procedura sql che elimina i record selezionati per id, facendo poi una re bind per refreshare la griglia.

>Grazie mille.
di nulla!
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

Romanaderoma Profilo | Newbie

>A mio avviso, alla pressione del tasto "DELETE" ipotetico andrei
>a scorrere sulla griglia, ricavando gli id legati a tutte le
>righe selezionate.
>Una volta che hai gli id, li potersti mettere in un datatable
>per poi passare questo datatable ad una procedura sql che elimina
>i record selezionati per id, facendo poi una re bind per refreshare
>la griglia.

potrsti fare un esempio?

alx_81 Profilo | Guru

>potrsti fare un esempio?
segui questo link
http://www.codeproject.com/KB/webforms/SelChkboxesDataGridView.aspx

vedrai che scorre la collezione delle righe dove una chkbox è clickata..
Sfruttala per il tuo requisito..

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

Romanaderoma Profilo | Newbie

>vedrai che scorre la collezione delle righe dove una chkbox è
>clickata..
>Sfruttala per il tuo requisito..

ma seleziona solo le checkbox? scusa per le domande ma sn un po profana su qst cosa
kmq grazie dell'aiuto e della disponibilità

alx_81 Profilo | Guru

>ma seleziona solo le checkbox? scusa per le domande ma sn un
>po profana su qst cosa
>kmq grazie dell'aiuto e della disponibilità
immagina di avere una grliglia, con checkbox riga per riga.
Ne selezioni n, fai la pressione del tasto (postkback), e a server conti quante righe hanno quel checkbox selected.
Quelle sono le righe di cui dovrai prendere il valore (che sta in un altro campo, accedibile in maniera identica, FindControl) da usare per fare la delete su database.
Se vuoi, con sql 2008 ci sono i table value parameters. Se usi quelli, crei un datatable con tutti gli id ricavati dalla ricerca delle checkbox.
Quel datatable sarà il parametro da passare via ado.net alla procedura di sql (stored procedure).
Il tipo da usare è SqlDBType.Structured.

ciao!

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

Romanaderoma Profilo | Newbie

>immagina di avere una grliglia, con checkbox riga per riga.
>Ne selezioni n, fai la pressione del tasto (postkback), e a server
>conti quante righe hanno quel checkbox selected.
>Quelle sono le righe di cui dovrai prendere il valore (che sta
>in un altro campo, accedibile in maniera identica, FindControl)
>da usare per fare la delete su database.
>Se vuoi, con sql 2008 ci sono i table value parameters. Se usi
>quelli, crei un datatable con tutti gli id ricavati dalla ricerca
>delle checkbox.
>Quel datatable sarà il parametro da passare via ado.net alla
>procedura di sql (stored procedure).
>Il tipo da usare è SqlDBType.Structured.

puoi farmi n esempio non è per approfittarmi ma se no nn capisco senza esempi


grazie!!!!









alx_81 Profilo | Guru

>puoi farmi n esempio non è per approfittarmi ma se no nn capisco
>senza esempi
>
>grazie!!!!
il primo quesito è il link che ti ho mandato prima.
Se guardi attentamente, vedrai che c'è il ciclo che gira sulla gridview.
Quello a posto?
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

Romanaderoma Profilo | Newbie


>il primo quesito è il link che ti ho mandato prima.
>Se guardi attentamente, vedrai che c'è il ciclo che gira sulla
>gridview.
>Quello a posto?

tu dici qst?
System.Text.StringBuilder str = new System.Text.StringBuilder();
// Select the checkboxes from the GridView control
for (int i = 0; i < Grid.Rows.Count; i++)
{
GridViewRow row = Grid.Rows[i];
bool isChecked = ((CheckBox)row.FindControl("chkSelect")).Checked;

if (isChecked)
{
// Column 2 is the name column
str.Append(Grid.Rows[i].Cells[2].Text);
}
}

si si ma poi che devo fare?

alx_81 Profilo | Guru

>si si ma poi che devo fare?
in quell'esempio si usa uno stringBuilder. A te non serve. Invece che popolare uno stringBuilder aggiungi gli elementi in un datatable:

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

alla fine hai il tuo datatable.
Ora, sai scrivere una stored procedure in SQL Server?



--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

Romanaderoma Profilo | Newbie

>// aggiunta righe (va ripetuta per ogni riga da aggiungere in
>base al fatto che la checkbox è selezionata o meno, invece che
>usare lo stringBuilder)
>DataRow dr = dt.NewRow();
>dr["ID"] = 1;
>dt.Rows.Add(dr);
ma è dinamico la riga selezionata può essere una o n a seconda della selezione...(nn so se ho detto una baggionata o nn ho capito)
>alla fine hai il tuo datatable.
>Ora, sai scrivere una stored procedure in SQL Server?
>
si si la so scrivere ;-)

alx_81 Profilo | Guru

>ma è dinamico la riga selezionata può essere una o n a seconda
>della selezione...(nn so se ho detto una baggionata o nn ho capito)
eh certo . Usa quel ciclo del link per controllare quali righe sono selezionate. Per ogni riga selezionata, aggiungine una nel datatable.
Quel datatable poi, lo passi alla stored procedure. Quello che ti ho allegato è la creazione di una datarow. Basta che la ripeti per ogni riga selezionata.
Mi sono spiegato?


--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

Romanaderoma Profilo | Newbie

>>ma è dinamico la riga selezionata può essere una o n a seconda
>>della selezione...(nn so se ho detto una baggionata o nn ho capito)
>eh certo . Usa quel ciclo del link per controllare quali
>righe sono selezionate. Per ogni riga selezionata, aggiungine
>una nel datatable.
>Quel datatable poi, lo passi alla stored procedure. Quello che
>ti ho allegato è la creazione di una datarow. Basta che la ripeti
>per ogni riga selezionata.
>Mi sono spiegato?
nn sto capendo
ti posto il codice:-)
e mi dici cosa sbaglio


int i;
int n = Gdv_EliminaStanza.Rows.Count;
// definizione
DataTable dt = new DataTable();
dt.Columns.Add("IdStanza", typeof(Int32));
dt.Columns.Add("IdServizio", typeof(Int32));

for (i = 0; i < n; i++)
{
GridViewRow row = Gdv_EliminaStanza.Rows[i];
bool isChecked = ((CheckBox)row.FindControl("chkSelect")).Checked;

if (isChecked)
{
DataRow dr = dt.NewRow();
dr["IdStanza"] = i;
dr["IdServizio"] = 0;
dt.Rows.Add(dr);

}
}

qst è la stored procedure già creata

public Boolean ModificaStanze()
{
parameterArray = new SqlParameter[4];

parameterArray[0] = new SqlParameter("@IdStanza", SqlDbType.Int);
parameterArray[0].Value = this.IdStanza;

parameterArray[1] = new SqlParameter("@Nome", SqlDbType.VarChar, 100);
parameterArray[1].Value = this.Nome;

parameterArray[2] = new SqlParameter("@Descrizione", SqlDbType.VarChar, 100);
parameterArray[2].Value = this.Descrizione;

parameterArray[3] = new SqlParameter("@IdServizio", SqlDbType.Int);
parameterArray[3].Value = this.IdServizio;


if (DB.Modifica("dbo.UpdateStanze", parameterArray))
{
Messaggio = "Aggiornamento effettuato";
return true;
}
else
Messaggio = DB.Messaggio;
return false;
}

alx_81 Profilo | Guru

>e mi dici cosa sbaglio
la stored procedure non prevede il passaggio del datatable, quindi il datatable a te non serve. Io dicevo di creare la tabella per passarla alla sp. Questa che vedo prevede un'esecuzione riga per riga.
Quindi puoi:
- scegliere di lanciare la sp per ogni riga che ha isChecked a true
- cambiare la sp che accetti la taballe

Il codice non sembra andare male. Hai provato a verificare in debug che l'ischecked venga valorizzato bene?

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

Romanaderoma Profilo | Newbie

>>e mi dici cosa sbaglio
>la stored procedure non prevede il passaggio del datatable, quindi
>il datatable a te non serve. Io dicevo di creare la tabella per
>passarla alla sp. Questa che vedo prevede un'esecuzione riga
>per riga.
>Quindi puoi:
>- scegliere di lanciare la sp per ogni riga che ha isChecked
>a true
>- cambiare la sp che accetti la taballe

puoi fare un esempio?
>
>Il codice non sembra andare male. Hai provato a verificare in
>debug che l'ischecked venga valorizzato bene?

si si viene valorizzato il punto sta qnd passo i parametri alla
sp

qst è la sp
public Boolean Modifica(string nomeSP, SqlParameter[] array)
{
int i;
int n = array.Length;
conn = ApriDB();
com = new SqlCommand(nomeSP, conn);
com.CommandType = CommandType.StoredProcedure;
for (i = 0; i<n; i++)
{
com.Parameters.Add(array[i]);
}
try
{
com.ExecuteNonQuery();
}
catch (SqlException ex)
{
Messaggio = ex.Message;
return false;
}
finally
{
conn.Close();
conn.Dispose();
}
return true;
}

qll che ti ho scritto prima gli passo i parametri

alx_81 Profilo | Guru

>puoi fare un esempio?
Creazione del tipo
CREATE TYPE dbo.tabellaProva AS TABLE ( id int, valore varchar(10) ) GO

Creazione stored che usa il tipo
CREATE PROCEDURE dbo.Prova @param1 int, @paramTable dbo.tabellaProva READONLY AS BEGIN -- ... contenuto della sp -- userai @paramTable come una normale tabella, così puoi joinare come meglio credi END GO

Passaggio del datatable alla sp con ADO.NET:
SqlCommand insertCommand = new SqlCommand("dbo.Prova", connection); SqlParameter tvpParam = insertCommand.Parameters.AddWithValue("@paramTable", tuoDataTable); tvpParam.SqlDbType = SqlDbType.Structured; tvpParam.TypeName = "dbo.tabellaProva";

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

Romanaderoma Profilo | Newbie

>>puoi fare un esempio?
>Creazione del tipo
>CREATE TYPE dbo.tabellaProva AS TABLE
>(
> id int,
> valore varchar(10)
>)
>GO
qst sempre su sql devo farla?

>Creazione stored che usa il tipo
>
>CREATE PROCEDURE dbo.Prova
>@param1 int,
>@paramTable dbo.tabellaProva READONLY
>AS
>BEGIN
>-- ... contenuto della sp
>-- userai @paramTable come una normale tabella, così puoi joinare
>come meglio credi
>END
>GO
>
>Passaggio del datatable alla sp con ADO.NET:
>
>SqlCommand insertCommand = new SqlCommand("dbo.Prova", connection);
>SqlParameter tvpParam = insertCommand.Parameters.AddWithValue("@paramTable",
>tuoDataTable);
>tvpParam.SqlDbType = SqlDbType.Structured;
>tvpParam.TypeName = "dbo.tabellaProva";
>
ok provo e ti faccio sapere grz mille :-)

Romanaderoma Profilo | Newbie

ho creato qst sp ma mi da errore nn mi riconosce il parametable

USE [NomemiaSP]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[nomemiasp]
(
@IdStanza int,
@ParamTable dbo.nometabella READONLY
)
AS
BEGIN
SET NOCOUNT ON;
DELETE FROM nometabella WHERE id=@ID
END
GO

sbaglio qualche cosa?

alx_81 Profilo | Guru

>sbaglio qualche cosa?
hai creato il tipo?

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

Romanaderoma Profilo | Newbie

no devo?

alx_81 Profilo | Guru

>no devo?
osserva bene il mio post precedente.. prima creo il tipo, poi lo uso nella sp. Poi lo passo in ado.net.
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

Romanaderoma Profilo | Newbie

>>no devo?
>osserva bene il mio post precedente.. prima creo il tipo, poi
>lo uso nella sp. Poi lo passo in ado.net.

ma il tipo sempre nella sp?

alx_81 Profilo | Guru

>>>no devo?
>>osserva bene il mio post precedente.. prima creo il tipo, poi
>>lo uso nella sp. Poi lo passo in ado.net.

>ma il tipo sempre nella sp?
lo crei su db, e poi lo usi come tipo del param quando serve, come un qualsiasi altro tipo utente..
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

Romanaderoma Profilo | Newbie

>lo crei su db, e poi lo usi come tipo del param quando serve,
>come un qualsiasi altro tipo utente..

grazie mille :-)
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-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5