Utilizzare datagridview in vb.2008

domenica 15 novembre 2009 - 16.58

basicdany Profilo | Expert

ciao a tutti e benritrovati, sono in sviluppo di una applicazione fatta in vb.2008 con sql server 2005, carico i dati in datagridview in questa maniera:
Dim CnGriglia As New SqlConnection(ConnectionString)
Dim sql As String

sql = "SELECT * FROM Immobili"

'Dim da1 As New OleDbDataAdapter(sql, CnGriglia)
Dim da1 As New SqlDataAdapter(sql, CnGriglia)
Dim ds1 As New DataSet

CnGriglia.Open()
da1.Fill(ds1, "Immobili")
DataGridImmobili.DataSource = ds1.Tables("Immobili")

avrei bisogno di effettuare:

1-autoresize della griglia in base alla larghezza che io imposto alla colonna
2-impostare quindi la larghezza di una colonna
3-nascondere una colonna
4-visualizzare il testo di una riga in rosso quando nel record e presente un campo a TRUE
5-Impostare io il testo per la testa di una colonna
6-non permettere di scrivere all'interno delle righe della griglia
7-visualizzare nell'ultima colonna della griglia 1 icone che cliccando sopra dovre effettuare un'operazione

Ringrazio tutti quelli che rendono questo forum sempre piu utile grazie!

alexmed Profilo | Guru

Ciao

>avrei bisogno di effettuare:
>
>1-autoresize della griglia in base alla larghezza che io imposto
>alla colonna

Dim w As Integer For i As Integer = 0 To Me.songsDataGridView.Columns.Count - 1 w += Me.songsDataGridView.Columns(i).Width Next Me.songsDataGridView.Width = w + 3

Questa potrebbe essere una soluzione ma ricorda che se hai righe che escono dall'altezza devi aggiungere la larghezza della barra di scorrimento.
>2-impostare quindi la larghezza di una colonna
Me.DataGridView.Columns(nome o index della colonna).Width = 100
>3-nascondere una colonna
Me.DataGridView1.Columns(nome o index della colonna).Visible = False
>4-visualizzare il testo di una riga in rosso quando nel record
>e presente un campo a TRUE
>5-Impostare io il testo per la testa di una colonna
Me.DataGridView1.Columns(0).HeaderText = "mio testo"
>6-non permettere di scrivere all'interno delle righe della griglia
Me.DataGridView1.ReadOnly = True
>7-visualizzare nell'ultima colonna della griglia 1 icone che
>cliccando sopra dovre effettuare un'operazione
Quale operazione?

Riassumendo un pò tutto

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

Il codice sopra prevede che tu abbia tra le Risorse le icone _Error, _Message e _Warning

>Ringrazio tutti quelli che rendono questo forum sempre piu utile
Speriamo
>grazie!
Prego

Ciao

alexmed

basicdany Profilo | Expert

ciao grazie tanto, il codice postato e ottimo:

1- per autosize
'Dim w As Integer
For i As Integer = 0 To Me.DataGridImmobili.Columns.Count - 1
w += Me.DataGridImmobili.Columns(i).Width
Next

non funziona, a me serve che impostando esempio una certa larghezza esempio 100 la cella deve ingrandirsi in modo mettere a capo il testo arrivato a 100 va a capo.

4-visualizzare il testo di una riga in rosso quando nel record, funziona il codice:
If Me.DataGridImmobili.Columns(e.ColumnIndex).Name = "IsTrattativa" Then
If e.Value = True Then
Me.DataGridImmobili.Item(e.ColumnIndex, e.RowIndex).Style.BackColor = Color.Red
End If
End If
ma voglio tutte le collone di quella riga solo il testo in rosso e non la cella.

5-vorrei caricare ad ogni riga nell'ultima colonna l'icona del simbolo cancella e cliccando sopra eliminare il record selezionato, e un altra icona che mi carichera i dati di quel record selezionata in un form.

grazie tanto le tue info sono molto presiose mi permetteno di andare avanti con il mio lavoro.

aspetto risposta grazie

alexmed Profilo | Guru

Ciao

>non funziona, a me serve che impostando esempio una certa larghezza
>esempio 100 la cella deve ingrandirsi in modo mettere a capo
>il testo arrivato a 100 va a capo.

nel codice che setta la DGV (SetupDataGridView()), dopo With DataGridView1 aggiungi .DefaultCellStyle.WrapMode = DataGridViewTriState.True

>4-visualizzare il testo di una riga in rosso quando nel record,
>funziona il codice:
>ma voglio tutte le collone di quella riga solo il testo in rosso
>e non la cella.

sostituisci
Me.DataGridView1.Item(e.ColumnIndex, e.RowIndex).Style.BackColor = Color.Red
con
Me.DataGridView1.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.RoyalBlue

>5-vorrei caricare ad ogni riga nell'ultima colonna l'icona del
>simbolo cancella e cliccando sopra eliminare il record selezionato,
Qui non devi cancellare la riga del DVG ma direttamente il record dalla tabella
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

>e un altra icona che mi carichera i dati di quel record selezionata
>in un form.
?
>grazie tanto le tue info sono molto presiose mi permetteno di
>andare avanti con il mio lavoro.
Prego

alexmed

basicdany Profilo | Expert

ciao per il punto:

>5-vorrei caricare ad ogni riga nell'ultima colonna l'icona del
>simbolo cancella e cliccando sopra eliminare il record selezionato,
Qui non devi cancellare la riga del DVG ma direttamente il record dalla tabella

-avrei bisogno di far vedere icona per l'eliminazione nell'ultima colonna della griglia, come la carico un icona nel datagridview?

grazie tanto

alexmed Profilo | Guru

Aggiungi nella Private Sub SetupDataGridView()

imgCol.Image = Image.FromFile("C:\Icon.png")

dopo

imgCol.Name = "Image"
DataGridView1.Columns.Add(imgCol)
imgCol.Width = 50

quindi

imgCol.Name = "Image"
DataGridView1.Columns.Add(imgCol)
imgCol.Width = 250
imgCol.Image = Image.FromFile("C:\Icon.png")

Ciao


alexmed

basicdany Profilo | Expert

ciao, per autosize o utilizzato quese istruzioni:

1)
.DefaultCellStyle.WrapMode = DataGridViewTriState.True 'per autosize
.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders

esegue l'autosize solo per le prime 15 righe (quelle che visualizzo subito) scorrendo con la scroll le alte righe non sono "autosize", come mai?

2)
per colorare in rosso il testo di una riga:

If Me.DataGridImmobili.Columns(e.ColumnIndex).Name = "IsTrattativa" Then
If e.Value = True Then
Me.DataGridImmobili.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.RoyalBlue
End If
End If

mi colora tutte le celle di quella riga, pero a me servirebbe colorare solo il testo se e possibile.
se il campo da controllare e nascosto non funziona a bisogna che il campo sia visibile nella griglia, e possibile risolvere questo problema?

tutte le altre cose ok funzionano

grazie spero posso ancora aiutarmi ciao grazie

alexmed Profilo | Guru

Ciao

>esegue l'autosize solo per le prime 15 righe (quelle che visualizzo
>subito) scorrendo con la scroll le alte righe non sono "autosize",
>come mai?
Si, quel metodo adatta solo le celle che in quel momento sono visualizzate. Prova con AllCells
Altrimenti ti rimando alla guida dove sono elencate le varie possibilità:
http://msdn.microsoft.com/it-it/library/system.windows.forms.datagridviewautosizecolumnsmode(VS.80).aspx

>2)
>mi colora tutte le celle di quella riga, pero a me servirebbe
>colorare solo il testo se e possibile.
>se il campo da controllare e nascosto non funziona a bisogna
>che il campo sia visibile nella griglia, e possibile risolvere
>questo problema?
Si, hai ragione sostituisci .BackColor con .ForeColor

Ciao

alexmed

basicdany Profilo | Expert

ciao,
-per l'autosize ho inserito le istruzioni all'evento DataGridImmobili_CellFormatting le seguent istruzioni:
DataGridImmobili.DefaultCellStyle.WrapMode = DataGridViewTriState.True 'per autosize
DataGridImmobili.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders 'per autosize
ok funziona
-avre bisogno di individuare qunado si fa click sull'immagine inserirta come mi hai spiegato prima:

imgColElimina.Name = ""
.Columns.Add(imgColElimina)
imgColElimina.Width = 30
imgColElimina.Image = Image.FromFile(Application.StartupPath & "\delete.gif")

come individuo la cella visto che non ho il nome della colonna, mi serve questo perche ho 3 immagini per ogni riga, ogni immagine deve eseguire un 'operazione. (uso evento datagrid CellClick)

-l'imagina se voglio inserirla all'inizio invece che alla fine della riga del datagridview, come lo faccio



-dopo che effettuo una cancellazione di un record dalla griglia ricarica la griglia come faccio inizialmente ma mi rimette le immagini a doppio nella griglia, come faccio ad azzerare la griglia e ricarica tutto per bene senza raddoppiare le immagini.

con questo ho finito grazie tanto sei stato un aiuto molto prezioso

alexmed Profilo | Guru

>-avre bisogno di individuare qunado si fa click sull'immagine
>inserirta come mi hai spiegato prima:

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

>come individuo la cella visto che non ho il nome della colonna,
>mi serve questo perche ho 3 immagini per ogni riga, ogni immagine
>deve eseguire un 'operazione. (uso evento datagrid CellClick)
Perchè non dai il nome alla colonna?

Prova al limite ad agire sull'index della colonna :

If Me.DataGridView1.Columns(e.ColumnIndex).Index= 0 Then
MsgBox(id)
End If

>-l'imagina se voglio inserirla all'inizio invece che alla fine
>della riga del datagridview, come lo faccio
Lavori sul DisplayIndex della colonna

Me.DataGridView1.Columns(4).DisplayIndex = 2
Me.DataGridView1.Columns("Image").DisplayIndex = 2

>
>
>
>-dopo che effettuo una cancellazione di un record dalla griglia
>ricarica la griglia come faccio inizialmente ma mi rimette le
>immagini a doppio nella griglia, come faccio ad azzerare la griglia
>e ricarica tutto per bene senza raddoppiare le immagini.
Strano! Essendo legata ad una tabella dovrebbe aggiornarsi automaticamente.
Prova a mettere questa riga:
Me.DataGrid.Rows.Clear()
prima di ricaricarla
>
>con questo ho finito grazie tanto sei stato un aiuto molto prezioso
Prego
alexmed

basicdany Profilo | Expert

ciao grazie tanto:

>-l'immagine se voglio inserirla all'inizio invece che alla fine
>della riga del datagridview, come lo faccio
Lavori sul DisplayIndex della colonna

Me.DataGridView1.Columns(4).DisplayIndex = 2
Me.DataGridView1.Columns("Image").DisplayIndex = 2

HO INSERITO QUESTO CODICE NON FUNZIONA MI DA MSG RIFERIMENTO A UN OGGETTO NON IMPOSTATO...:

Dim imgColVisualizza As New DataGridViewImageColumn

imgColVisualizza.Name = ""
.Columns.Add(imgColVisualizza)
imgColVisualizza.Width = 30
imgColVisualizza.Image = Image.FromFile(Application.StartupPath & "\showDetail.gif")
.Columns("imgColVisualizza").DisplayIndex = 1

>
>
>
>-dopo che effettuo una cancellazione di un record dalla griglia
>ricarica la griglia come faccio inizialmente ma mi rimette le
>immagini a doppio nella griglia, come faccio ad azzerare la griglia
>e ricarica tutto per bene senza raddoppiare le immagini.
Strano! Essendo legata ad una tabella dovrebbe aggiornarsi automaticamente.
Prova a mettere questa riga:

Me.DataGrid.Rows.Clear()

prima di ricaricarla

HO INSERITO NON FUNZIONA mi raddoppia sempre e solo le immagini:

DataGridImmobili.Rows.Clear()

CaricaGriglia()

ImpostaGriglia()

IL SECONDO PROBLEMA E MOLTO IMPORTANTE IL PRIMO POSSO ANCHE OVVIARE SE NON C'E SOLUZIONE

GRAZIE

alexmed Profilo | Guru

Ciao

>HO INSERITO QUESTO CODICE NON FUNZIONA MI DA MSG RIFERIMENTO
>A UN OGGETTO NON IMPOSTATO...:

Dim imgColVisualizza As New DataGridViewImageColumn

imgColVisualizza.Name = ""
imgColVisualizza.Width = 30
imgColVisualizza.Image = Image.FromFile(Application.StartupPath & "\showDetail.gif")
imgColVisualizza.DisplayIndex = 1

Me.DataGridView1.Columns.Add(imgColVisualizza)


>HO INSERITO NON FUNZIONA mi raddoppia sempre e solo le immagini:
>
> DataGridImmobili.Rows.Clear()
>
> CaricaGriglia()
>
> ImpostaGriglia()
>
>IL SECONDO PROBLEMA E MOLTO IMPORTANTE IL PRIMO POSSO ANCHE OVVIARE
>SE NON C'E SOLUZIONE

Mi posti:
CaricaGriglia()
e
ImpostaGriglia()

Ciao

alexmed

basicdany Profilo | Expert

Ti posto le 2 procedure mi E RIMASTO SOLO QUESTO PROBLEMA E PIUTROPPO E IL PIU IMPORTANTE!!! SPERO MI POTRAI AIUTARE:

Public Sub CaricaGriglia()
Try

Dim CnGriglia As New SqlConnection(ConnectionString)
Dim sql As String

'sql = "SELECT * FROM Immobili"

sql = "SELECT * FROM QCaricaGriglia"

Dim da1 As New SqlDataAdapter(sql, CnGriglia)
Dim ds1 As New DataSet

CnGriglia.Open()
da1.Fill(ds1, "Immobili")
DataGridImmobili.DataSource = ds1.Tables("Immobili")


Catch ex As Exception
MsgBox(Err.Description)

End Try
End Sub

Sub ImpostaGriglia()
Try


Dim imgColVisualizza As New DataGridViewImageColumn
Dim imgColElimina As New DataGridViewImageColumn
Dim imgColModifica As New DataGridViewImageColumn

With DataGridImmobili

'.DefaultCellStyle.WrapMode = DataGridViewTriState.True 'per autosize
'.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders 'per autosize
.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single
.CellBorderStyle = DataGridViewCellBorderStyle.Single
.GridColor = Color.Blue
.RowHeadersVisible = False
.ReadOnly = True

.SelectionMode = DataGridViewSelectionMode.FullRowSelect
.MultiSelect = False

'.Columns(0).HeaderText = "ciao" 'per modificare nome testa in alternativa si usa Columns("ID").HeaderText = "Codice"
'.Columns(0).Width = 300 per dimensione in alternativa si usa .Columns("ID").Width = 300

imgColVisualizza.Name = ""
.Columns.Add(imgColVisualizza)
imgColVisualizza.Width = 30
imgColVisualizza.Image = Image.FromFile(Application.StartupPath & "\showDetail.gif")
'.Columns("imgColVisualizza").DisplayIndex = 10

.Columns("ID").Width = 50
.Columns("ID").HeaderText = "Cod.Rif." 'modificare testa

.Columns("DataInsert").Width = 100
.Columns("DataInsert").HeaderText = "Data" 'modificare testa

.Columns("TipoImmobile").Width = 100
.Columns("TipoImmobile").HeaderText = "Tipologia" 'modificare testa

.Columns("Denominazione").Width = 80
.Columns("Denominazione").HeaderText = "Città" 'modificare testa

.Columns("IndRiservato").Width = 160
.Columns("IndRiservato").HeaderText = "Indirizzo" 'modificare testa

.Columns("NumVani").Width = 40
.Columns("NumVani").HeaderText = "Vani" 'modificare testa

.Columns("Piano").Width = 80
.Columns("Piano").HeaderText = "Piano" 'modificare testa

.Columns("StatoImmobile").Width = 60
.Columns("StatoImmobile").HeaderText = "Stato" 'modificare testa

.Columns("Prezzo").Width = 80
.Columns("Prezzo").HeaderText = "Prezzo" 'modificare testa

.Columns("Contratto").Width = 70
.Columns("Contratto").HeaderText = "Contratto" 'modificare testa

.Columns("Incarico").Width = 60
.Columns("Incarico").HeaderText = "Incarico" 'modificare testa


imgColModifica.Name = ""
.Columns.Add(imgColModifica)
imgColModifica.Width = 30
imgColModifica.Image = Image.FromFile(Application.StartupPath & "\edit.gif")

imgColElimina.Name = ""
.Columns.Add(imgColElimina)
imgColElimina.Width = 30
imgColElimina.Image = Image.FromFile(Application.StartupPath & "\delete.gif")


End With


Catch ex As Exception
MsgBox(Err.Description)

End Try
End Sub


GRAZIE TANTO

alexmed Profilo | Guru

Eccomi
Allora:
Ho voluto fare anche un paio di prove ma la soluzione più semplice e più banale sembra essere aggiungere una riga:

Me.DataGridImmobili.Columns.Clear()

dove?

Public Sub CaricaGriglia()
Try

>Me.DataGridImmobili.Columns.Clear() 'QUI

Dim CnGriglia As New SqlConnection(ConnectionString)
Dim sql As String

'sql = "SELECT * FROM Immobili"

sql = "SELECT * FROM QCaricaGriglia"

Dim da1 As New SqlDataAdapter(sql, CnGriglia)
Dim ds1 As New DataSet

CnGriglia.Open()
da1.Fill(ds1, "Immobili")
DataGridImmobili.DataSource = ds1.Tables("Immobili")


Catch ex As Exception
MsgBox(Err.Description)

End Try
End Sub

Comunque ti allego un progettino che racchiude tutto (o quasi)

Ciao

alexmed
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5