Ripulire datagridview

martedì 16 settembre 2008 - 10.07

trinity Profilo | Guru

Salve ragazzi,
prima che io carico i dati in un datagridview vorrei ripulire interamente la griglia, sapete dirmi il comando?

ecco il codice che eseguo per caricare il datagridview:


Dim buttons As New DataGridViewButtonColumn() With buttons .HeaderText = "Modifica" .Text = "Modifica" .UseColumnTextForButtonValue = True .AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells .FlatStyle = FlatStyle.Standard .Frozen = True .CellTemplate.Style.BackColor = Color.Honeydew .DisplayIndex = 0 End With DataGridView1.Columns.Add(buttons) Dim buttons1 As New DataGridViewButtonColumn() With buttons1 .HeaderText = "Elimina" .Text = "Elimina" .UseColumnTextForButtonValue = True .AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells .FlatStyle = FlatStyle.Standard .Frozen = True .CellTemplate.Style.BackColor = Color.Honeydew .DisplayIndex = 1 End With DataGridView1.Columns.Add(buttons1) Dim buttonsimg As New DataGridViewImageColumn With buttonsimg .Image = My.Resources.kuser .MinimumWidth = 24 .Frozen = True .ImageLayout = DataGridViewImageCellLayout.Stretch .AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader .CellTemplate.Style.BackColor = Color.Honeydew .DisplayIndex = 2 End With DataGridView1.Columns.Add(buttonsimg) ObjC59.CodAlbergo = codalb ObjC59.CodComAlbergo = codcomalb ObjC59.DataElaborazione = data C59Coll = Read_record.CaricaSchedine(ObjC59) Movimenti = New DataSet1.MovimentiDataTable For i As Integer = 0 To C59Coll.Count - 1 MovimentiMyRow = CType(Movimenti.NewRow, DataSet1.MovimentiRow) MovimentiMyRow.Progschedina = C59Coll.Item(i).NumeroSchedina MovimentiMyRow.codalbergo = C59Coll.Item(i).CodAlbergo MovimentiMyRow.codcomalbergo = C59Coll.Item(i).CodComAlbergo MovimentiMyRow.DataArrivo = CDate(C59Coll.Item(i).DataArrivo) If C59Coll.Item(i).DataPartenza = String.Empty Then Else MovimentiMyRow.DataPartenza = CDate(C59Coll.Item(i).DataPartenza) End If MovimentiMyRow.nrcomp = C59Coll.Item(i).NumeroComponenti MovimentiMyRow.Stato = C59Coll.Item(i).StatoResidenza MovimentiMyRow.Comune = C59Coll.Item(i).ComuneResidenza MovimentiMyRow.Gruppo = C59Coll.Item(i).DescrizioneGruppo Movimenti.Rows.Add(MovimentiMyRow) Next i ds.Merge(Movimenti) Me.DataGridView1.DataSource = ds Me.DataGridView1.DataMember = "Movimenti" Me.DataGridView1.Columns(3).Visible = False Me.DataGridView1.Columns(4).Visible = False Me.DataGridView1.Columns(5).Visible = False

se il lo eseguo + volte le colonne modifica, elimina e dell'immagine mi si raddoppiano oppure triplicano x il numero di volte che ricarico la griglia


secondo il modo in cui carico i dati è corretto oppure ci sono altri metodi?

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

sanbiz Profilo | Senior Member

>prima che io carico i dati in un datagridview vorrei ripulire
>interamente la griglia, sapete dirmi il comando?
Cosa intendi per "pulire"?
Se vuoi rimuovere tutte le righe puoi usare .Rows.Clear
Se vuoi rimuovere tutte le colonne puoi usare .Columns.Clear
Se vuoi rimuovere la fonte dati puoi impostare a Nothing la proprietà .DataSource
--
Sandro Bizioli
http://blogs.dotnethell.it/sandro/

trinity Profilo | Guru

Ciao Sandro,

allora se vedi nel mio post ho postato il codice intero che utilizzo per caricare i dati nel datagrid, prima di tutto secondo te va bene?

se ci fai caso io cmq a monte aggiungo le colonne modifica, elimina e immagine, poi se i dati non ci sono allora la griglia resta vuota, ma se poi io dal mio applicativo carico altri dati, le colonne modifica, elimina ecc.. si raddoppiano perchè cmq all'inizio pur non essendoci dati da visualizzare le colonne sono state aggiunte.

Come posso procedere?
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

sanbiz Profilo | Senior Member

>se ci fai caso io cmq a monte aggiungo le colonne modifica, elimina
>e immagine, poi se i dati non ci sono allora la griglia resta
>vuota, ma se poi io dal mio applicativo carico altri dati, le
>colonne modifica, elimina ecc.. si raddoppiano perchè cmq all'inizio
>pur non essendoci dati da visualizzare le colonne sono state
>aggiunte.

All'inizio della tua routine che inserisce le colonne ed i dati 8quella postata) inserisci l'istruzione
DataGridView1.Columns.Clear()

Come detto nel precedente post, questa istruzione rimuove la collection delle colonne dal tuo DataGridView.
--
Sandro Bizioli
http://blogs.dotnethell.it/sandro/

trinity Profilo | Guru

ho inserito proprio all'inizio della routine questo codice:

Me.DataGridView1.Columns.Clear()

ma mi genera appena carico i dati in griglia il seguente errore:


1280x800 192Kb



ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

freeteo Profilo | Guru

ciao,
per pulire i dati di una griglia puoi anche settare la sua datasource = null, così lui non pulisce quello che ha disegnato.

Per il fatto dell'errore, è abbastanza chiaro che in quel momento non ha nessuna colonna, a debug dovresti accorgertene mettendo un punto di interruzione e vedendo tutte le proprietà della gridview nella finestra "Watch".

Non capisco ci deve essere qualche impostazione che non fa caricare le colonne alla griglia...
ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

trinity Profilo | Guru

Dal codice che ho postato all'inizio non puoi vedere se sbaglio qualcosa?

ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

freeteo Profilo | Guru

>Dal codice che ho postato all'inizio non puoi vedere se sbaglio
>qualcosa?
guarda non mi sembra a parte che il codice che hai scritto non ho capito "perchè" lo hai scritto, ovvero perchè non aggiungi a design time le colonne, ma lo fai da codice.

A parte questo, l'unica cosa che mi viene da pensare è che magari la tabella che agganci alla DataGridView non si chiami effettivamente "Movimenti", prova a verificare che la tabella del DataSet "ds" si chiami così, o eventualmente prova a passare alla griglia direttamente la table:

griglia.DataSource = ds.Tables(0)

cambia qualcosa?
ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

trinity Profilo | Guru

oggi pomeriggio provo,
scusa perchè le colonne potevo caricarle in un altro modo? e come?

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

freeteo Profilo | Guru

>oggi pomeriggio provo,
>scusa perchè le colonne potevo caricarle in un altro modo? e
>come?
le puoi caricare aggiungendole a design-time sulla form (tasto Dx sulla griglia->add columns) e metterle giu, specificando quale sarà la proprietà (dataPropertyName) che visualizzerà, ovvero il nome della colonna della datatable che gli passi poi da codice.
Questo alla fine porta alla generazione da parte di visual studio di un codice molto simile al tuo, ma il vantaggio è che lo fa visual studio per te nel file "TuaForm.Designer.vb" e non ce l'hai sempre tra i piedi :)

ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

trinity Profilo | Guru

senti ultima cosa, io devo inserire tre colonne particolari due di tipo button ed una di tipo image e in quella di tipo image devo gestire a seconda dei record due tipi di immagini, come posso fare?
Secondo io dovrei colorare le righe ossia il lo backcolor sempre a seconda dei tipi di record, non in maniera alternata e questo devo farlo via codice oppure in automatico si può gestire?

Mi dai questa piccola mano?

Ciao e grazie
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

freeteo Profilo | Guru

>senti ultima cosa, io devo inserire tre colonne particolari due
>di tipo button ed una di tipo image e in quella di tipo image
>devo gestire a seconda dei record due tipi di immagini, come
>posso fare?
scusami ma ti ho già risposto qui: http://www.dotnethell.it/forum/messages.aspx?ThreadID=25182
ed al momento la mia risposta non cambia, devi lavorare con l'evento "CellFormatting" e decidere cosa visualizzare in quella particolare colonna


>Secondo io dovrei colorare le righe ossia il lo backcolor sempre
>a seconda dei tipi di record, non in maniera alternata e questo
>devo farlo via codice oppure in automatico si può gestire?
questo invece lo puoi fare usando lo stesso concetto di cui sopra, ovvero intercettando l'evento che viene scatenato dalla griglia prima di "disegnare" a video le sue celle, in questo caso però l'evento è "CellPainting", e non "CellFormatting", e dentro a quell'evento gli setti:
e.CellStyle.BackColor = Color.XXX
il tutto in base alle tue "if"...
ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

trinity Profilo | Guru

Ho scritto così:

If Me.DataGridView1.Columns(4).Index = _ e.ColumnIndex AndAlso e.RowIndex >= 0 Then If Me.DataGridView1.Rows(e.RowIndex).Cells.Item(4).Value Is "Arrivo" Then e.CellStyle.BackColor = Color.Green ElseIf Me.DataGridView1.Rows(e.RowIndex).Cells.Item(4).Value Is "Partenza" Then e.CellStyle.BackColor = Color.Red End If End If

e funziona, ma se io volessi cambiare il backcolor di tutta la riga e non solo di una come devo fare
ah poi per quanto riguarda il discorso del settaggio dell'immagine, ho visto il tuo codice nell'altro post e lo sto testando solo che nel mio caso io ho una colonna image e una testo a seconda del valore della colonna testo deve variare l'immagine, io ho scritto così:

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


solo che come faccio a dire che la colonna image è la numero 3 per intederci?

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

freeteo Profilo | Guru

>e funziona, ma se io volessi cambiare il backcolor di tutta la
>riga e non solo di una come devo fare
quell'evento viene scatenato per ogni cella, quindi ti basta evitare di controllare che la colonna sia la 4, quindi lasciarlo per tutte le celle che quindi sarebbe l'intera riga.
Poi nel tuo codice c'è un'altra imprecisione, ovvero questa:
If Me.DataGridView1.Columns(4).Index = e.ColumnIndex ....
dove gli dici se l'indice della colonna di indice 4 è lo stesso della colonna corrente, ma non ti bastava controllare e.ColumnIndex = 4 no?


>ah poi per quanto riguarda il discorso del settaggio dell'immagine,
>ho visto il tuo codice nell'altro post e lo sto testando solo
>...
>solo che come faccio a dire che la colonna image è la numero
>3 per intederci?
non so se ho inteso bene, ma ti basta anche qui fare quel codice preceduto da un if e.columnIndex = 3 then oppure se vuoi metterlo tutto sulla stessa condizione, come vai meglio, ma è quello il controllo da fare.


* ps: alle colonne puoi accedere anche tramite nome, non solamente per numero, quindi:
...Me.DataGridView1.Columns("colonna")...
questo ti aiuta un domani se cambi l'ordine per qualche motivo.
ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

trinity Profilo | Guru

>Ho scritto così:
>
> If Me.DataGridView1.Columns(4).Index = _
> e.ColumnIndex AndAlso e.RowIndex >= 0 Then

questo controllo l'ho visto su l'msdn e mi serve a gestire l'evento prima che vengono caricate le righe...
oppure sbaglio e vi è un altro metodo?

eseguo questo controllo perchè se lo ometto nell'evento cellpainting mi esce questo messaggio di errore:

Index non compreso nell'intervallo. Richiesto valore non negativo e minore della dimensione dell'insieme. Nome parametro: index

in quanto mi serve per determinare se ci record caricati oppure no

ciao



>If Me.DataGridView1.Rows(e.RowIndex).Cells.Item(4).Value Is "Arrivo"
>Then
> e.CellStyle.BackColor = Color.Green
>ElseIf Me.DataGridView1.Rows(e.RowIndex).Cells.Item(4).Value
>Is "Partenza" Then
> e.CellStyle.BackColor = Color.Red
> End If
> End If
>
>e funziona, ma se io volessi cambiare il backcolor di tutta la
>riga e non solo di una come devo fare
>ah poi per quanto riguarda il discorso del settaggio dell'immagine,
>ho visto il tuo codice nell'altro post e lo sto testando solo
>che nel mio caso io ho una colonna image e una testo a seconda
>del valore della colonna testo deve variare l'immagine, io ho
>scritto così:
>
>Private Sub DataGridView1_CellFormatting(ByVal sender As Object,
>ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs)
>Handles DataGridView1.CellFormatting
>If Me.DataGridView1.Columns(6).Index = e.ColumnIndex AndAlso
>e.RowIndex >= 0 Then
>If Me.DataGridView1.Rows(e.RowIndex).Cells.Item(6).Value Is "1"
>Then
> e.Value = My.Resources.kuser
> Else
> e.Value = My.Resources.Login_Manager
> End If
> End If
> End Sub
>
>
>solo che come faccio a dire che la colonna image è la numero
>3 per intederci?
>
>Ciao
>Cirillo Fabio
>www.wondernet.biz
>fabio@wondernet.biz
>http://blogs.dotnethell.it/fabiocirillo/
>http://wnetsoftware.blogspot.com

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com
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