[VS2005] Elimina Selezionati - CheckBox

mercoledì 01 ottobre 2008 - 11.42

gdlcore Profilo | Junior Member

Ciao a tutti, questo è il mio problema: ho creato un database con una tabella "Carrello" che contiene dei record, una colonna si chiama "Elimina" ed è un campo CheckBox.
Ora dopo averlo caricato nel form Carrello del mio progetto attraverso un datagridview, ho la possibilità di checkare il campo.

Poi ho creato un tasto chiamato "Elimina selezionati" che dovrebbe fare in modo che al momento della pressione su di esso dovrebbe eliminarmi le righe selezionate dal datagrid e con il tasto salva poi salvarlo sul database.

Vi allego l'immagine del form per capire meglio la situazione anche graficamente.. aspetto vostro aiuto, ciao a tutti!

Harley.Net82 Profilo | Junior Member

Ciao, ecco il codice per eliminare i selezionati

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

gdlcore Profilo | Junior Member

OK perfetto funziona, però mi è uscito questo errore adesso che non mi fa andare il salvataggio, ti posto il codice compresa la parte che salva sul db:

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

Ti ho evidenziato dove è l'errore. Mi dice questo:
"Impossibile accedere alle informazioni sulla riga eliminata tramite la riga."

Secondo te cosa può essere?

Harley.Net82 Profilo | Junior Member

Credo di sapere cosa può essere.

Nel codice che mi hai scritto, tu valorizzi il tuo DataTable in questo modo:

Dim t As DataTable = CType(CarrelloDataGridView.DataSource, DataTable)

In pratica usi il DataSource del Grid che però non tiene conto del fatto che tu hai eliminato delle righe.

Il Datasource fa riferimento allo stato iniziale del Grid. Infatti l' errore te lo da la prima volta in cui provi ad accedere
ad una delle righe che potresti aver eliminato:

y("ID")

Quindi se proprio vuoi usare un DataTable, creane uno da codice e riempilo scorrendo le righe del Grid una ad una.

Ps: Se la risposta è di tuo gradimento ti ricordo di "Accettarla"...grazie

Buon Lavoro

Davide

gdlcore Profilo | Junior Member

E come faccio a riempirne una ad una?
Come devo fare a riempirla se nn con una select?

secks Profilo | Senior Member

Secondo me dovresti fare così per continuare il discorso iniziale:

Private Sub ButtElim_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtElim.Click

'Carico la tabella dal DataGridView ( vedi se la sintassi è corretta)
dim t as datatable = ctype( CarrelloDataGridView.Datasorce, Datatable )

'Andare all'incontrario in quanto in DataTable quando cancelli una row scala di 1


Dim c, x As Integer
c = 0
x = 0
For c = CarrelloDataGridView.RowCount - 1 To 0
If CarrelloDataGridView.Rows(x).Cells(2).Value = True Then
CarrelloDataGridView.Rows.RemoveAt(x)
Else
x -= 1
End If
Next
End Sub

Fai una prova seguendo il concetto e corregendo eventualmente la sintassi, dovrebbe funzionare.
Ciao.
Paolo.

gdlcore Profilo | Junior Member

Ho provato con il tuo codice..ma ora non me le cancella più le righe..il problema sta poi nel salvataggio, l'altro metodo mi cancella le righe, ma al momento del tasto salva mi da l'errore che ho postato prima..
Non riesco a capire come procedere..bisogna riuscire a cancellare le righe selezionate e rimettere tutto il datagrid nella tabella del db, però prima di rimetterla nel db secondo me ci sarebbe da svuotare la tabella e riscriverla, tu cosa dici? Potrebbe essere una soluzione?

Harley.Net82 Profilo | Junior Member

Scusa ma partendo dal basso non risolve il problema.

Oppure mi sfugge qualcosa.

Per me ti conviene fare così:

Per caricate il tuo DataTable dal Grid, fai così:

prima crei il DataTable da zero:

Dim T as new DataTable T.Columns.Add("Nome Colonna")

Aggiungi tante colonne quante te ne servono per ricreare la struttura del tuo Grid.

Poi per riempire il DataTable fai così:

For each Rg as DataGridViewRow in DataGridView.Rows T.Rows.InsertAt(T.NewRow, T.Rows.Count) For each Cg as DataGridViewColumn in DataGridView.Columns T.Rows(T.Rows.Count-1).Item(Cg.Index)=Rg.Cells(Cg.Index).Value Next Next

Il gioco è fatto.

secks Profilo | Senior Member

Purtroppo in ufficio uso solo VB.2003 e dovrei fare una prova a casa.
Comunque così dovrebbe funzionare:

dim t as datatable = ctype( CarrelloDataGridView.Datasorce, Datatable )

Dim c As Integer = 0

c = 0

For c = t.rows.count - 1 To 0
If t.rows(c)("CampoCancella") Then
t.Rows.Remove(c)
End If

End Sub

Ciao.
Paolo.

gdlcore Profilo | Junior Member

Ciao..non sono riuscito a risolvere il problema..
Nel codice che mi hai dato tu mi da questo errore:
Impossibile convertire il valore di tipo "Integer" in "System.Data.DataRow".

Ti faccio vedere in quale riga:

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

Non riusciamo a risolvere il problema?
Aspetto tua risposta grazie..

secks Profilo | Senior Member

For c = t.rows.count - 1 To 0
If t.rows(c)("CampoCancella") Then
''''''''''t.Rows.Remove(c) <------- L'errore è qua sulla "c"

prova così:

t.Rows(c).delete


End If
Next

gdlcore Profilo | Junior Member

Non va..non mi cancella nemmeno la riga selezionata..uffa, mi sto quasi arrendendo..
Mi passa la voglia di cercare di programmare..

secks Profilo | Senior Member

Ti da qualche errore?

Purtroppo non ho l'ambiente sottomano per fare una prova, comunque dovrebbe funzionare ...

tra l'atro la DataGridView la sto provando anch'io.

Alla fine riassegna la tabella alla datagridview:

Private Sub ButtElim_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtElim.Click
Dim t As DataTable = CType(CarrelloDataGridView.DataSource, DataTable)

Dim c As Integer = 0

c = 0

For c = t.rows.count - 1 To 0
If t.rows(c)("CampoCancella") Then
t.Rows(c).delete
End If
Next

CarrelloDataGridView.DataSource = t 'NUOVA ISTRUZIONE
End Sub

Ciao.
Paolo.

alexmed Profilo | Guru

Ciao
Secondo me dovresti agire in questo modo

Una volta selezionate le righe da eliminare invii un "UPDATE" e sucessivamente, sempre con il button_delete, un "DELETE WHERE nome_colonna_check = TRUE" dopodichè ricarichi con un Fill

Se non vuoi eliminare completamente dalla Tabella le righe ma tenerne comunque traccia potresti sempre aggiornare il campo check e poi fare il Fill con la clausola WHERE solo su quelle righe in cui il la colonna check è impostata su false.

Ho visto che i vostri codici agiscono sul contenuto della DGV e non sul DB, ma tu le righe le devi eliminare dal DB. Giusto?

Ciao

gdlcore Profilo | Junior Member

Esatto io le devo eliminare sul DB perchè poi utilizzo quello in seguito perchè sarà aggiornato..
La tua spiegazione mi sembra logica, ma non essendo un bravissimo non so metterla in pratica in codice..
Riesci a buttare giu qualche riga per provarlo?
Dai ci proviamo, grazie..


Per Paolo:
Niente non funziona, quando clicco sul Tasto "Elimina Selezionati" non mi fa niente, rimane tutto com'è..

Grazie a tutti..

alexmed Profilo | Guru

Posso dargli un'occhiata ma dovresti passarmi il DB, perchè qui in ufficio non ho Access.
Ciao

gdlcore Profilo | Junior Member

Questo è il DB..
La tabella da aggiornare è la tabella carrello, questo è il codice per i due tasti "Elimina Selezionati" e "Salva". Per il tasto "Elimina Selezionati ho lasciato il codice vuoto..prova vedere cosa riesci a fare:

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

Grazie..

alexmed Profilo | Guru

Ciao
Questo è quello che ho pensato
Sono partito da zero, quindi ti dovrai reimpostare solo alcune cosette.

Ciao

gdlcore Profilo | Junior Member

Ok perfetto, è la soluzione esatta! Ho solo cambiato alcune variabili ed è tutto funzionante!
Grazie per la pazienza! Ora devo aprire qualche nuovo thread per altri problemi!
Chissà se un giorno diventerò bravo anch'io..me lo chiedo sempre..
Grazie ancora!!

alexmed Profilo | Guru

Ciao

Grazie per la pazienza! Ora devo aprire qualche nuovo thread per altri problemi!
Prego

Io, se riesco a fare certe cose (semplici), è grazie a questi siti ed a qlq buon libro.

Ciao

gdlcore Profilo | Junior Member

Ciao scusa se ti chiedo ancora su questa cosa, ma non riesco a far funzionare un paio di cose..siccome il tasto "Load" non mi serve vederlo ho impostato la sua proprietà visible a "False" però non funziona se faccio cosi..come mai?
Poi ho provato anche a sostituire i tasti normali mettendogli delle immagini per farlo diventare un pochino piu carino esteticamente, ma alla fine con i button funziona e con una picturebox no..
C'è un motivo?

alexmed Profilo | Guru

Puoi fare così

Crei una sub indipendente

Public Sub loadCARRELLO()

Try
conn.Open()
cmd = New OleDbCommand("SELECT * FROM Carrello", conn)
daCARRELLO = New OleDbDataAdapter()
daCARRELLO.SelectCommand = cmd
dtCARRELLO = New DataTable()
daCARRELLO.Fill(dtCARRELLO)

Me.dgvCARRELLO.DataSource = Me.dtCARRELLO

conn.Close()

Catch ex As Exception
MsgBox(ex.Message)
End Try

End Sub

che richiamerai al posto del btn_PerformClick()

Ciao

gdlcore Profilo | Junior Member

OK fatto..però il problema con la picture box al posto del button rimane..
Al posto del button con scritto "Elimina Selezionati" ho voluto mettere una picture box che al momento del click facesse la stessa cosa del button, ho solamente copiato e incollato il codice, solo che con la picture box non funziona e con il button si..ma perchè?Boh..

alexmed Profilo | Guru

Ciao

Mettendo questo codice?


Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click

deleteCARRELLO()

End Sub

Public Sub deleteCARRELLO()

Try

conn.Open()

For i As Integer = 0 To Me.dgvCARRELLO.RowCount - 1
If Me.dgvCARRELLO.Item(2, i).Value = True Then 'Qui controllo quali righe sono selezionate per eliminarle in maniera definitiva
Dim idDescrizione As Integer = Me.dgvCARRELLO.Item(3, i).Value
cmd = New OleDbCommand("DELETE FROM Carrello WHERE id = " & idDescrizione & "", conn)
cmd.ExecuteNonQuery()
End If
Next

conn.Close()

'Ricarico il DB
loadCARRELLO()

'Me.btnLOAD.PerformClick()

Catch ex As Exception
MsgBox(ex.Message)
End Try

End Sub

gdlcore Profilo | Junior Member

No..non vuole andare, quando clicco sulla picturebox è come se ricaricasse ancora il db da capo, quindi non ho nessuna operazione..però se creo un altro button su quello mi funziona..

alexmed Profilo | Guru

Si in effetti ha un comportamento strano
Se carico 5 o 6 record e li seleziono tutti, uno tra quelli selezionati non lo cancella.

Boh!!!

Cosa ne dici di sostituire la pBox con un btn ed imposti la proprietà FlatStyle a "Popup" in modo da renderlo "piatto" poi ci carichi un'immagine.

Ciao

alexmed Profilo | Guru

Ti allego il la soluzione

gdlcore Profilo | Junior Member

Si ho fatto cosi..perchè non si poteva far andare altrimenti, incredibile..cmq l'importante è che siamo riusciti ad arrivare ad una conclusione!
Ora apro un post per il tasto exit che non so come far intercettare la mia risposta "Si" o "No"..
Grazie delle risposte immediate!
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5