Visualizzare o nascondere colonne in un Datagrid vb.net

lunedì 21 febbraio 2005 - 10.30

genuxmax Profilo | Newbie

Ciao a tutti,
ho un piccolo problema di visualizzazione dati con un datagrid.
Io vorrei fare una select * from tabella, ma nel datagrid vorrei far visualizzare solo alcuni campi e non tutti; come posso fare?
Inoltre, c'è un modo per far visualizzare i campi nella sequenza che voglio io e non come sono nella tabella?

Grazie
Mauro

AntCiar Profilo | Expert

ciao.
Puoi usare gli stili di griglia. di seguito ti posto un po di codice e di istruzioni che ho usato per fare quello che chiedi.

Puoi usare come datasource della datagrid sia una datatable, sia un dataview. All'interno del codice faccio riferimento al datasource utilizzando il nome "Pippo".


dim DataGridTableStyleGen As DataGridTableStyle
dim ColumnStyleGen As DatagridColumnStyle

DataGridTableStyleGen = New DataGridTableStyle()
DataGridTableStyleGen.MappingName = Pippo.Tablename

'stile della colonna

ColumnStyleGen = New DataGridTextBoxColumn()

ColumnStyleGen.MappingName = pippo.campo1
ColumnStyleGen.HeaderText = testo visualizzato come intestazione di colonna
ColumnStyleGen.Width = 50 'larghezza della colonna
DataGridTableStyleGen.GridColumnStyles.Add(ColumnStyleGen)

....
crea più copie del blocco precedente a seconda di quante colonne vuoi far vedere nella griglia
...


' Add the DataGridTableStyle objects to the collection.
DataGrid1.TableStyles.Clear()
DataGrid1.TableStyles.Add(DataGridTableStyleGen)
Me.DataGrid1.DataSource = pippo

Nota: L'ordine con cui scrivi i blocchi delle colonne corrisponde all'ordine di visualizzazione delle stesse. Inoltre puoi definire il tipo di colonna quando effettui l'operazione "ColumnStyleGen = New DataGridTextBoxColumn()"
Puoi scegliere tra i seguenti tipi:
DataGridTextBoxColumn() - colonna di testo
DataGridBoolColumn() - colonna con checked box

Spero di essetri stato di aiuto
Cristian

genuxmax Profilo | Newbie

Ciao Cristian,
grazie per l'esempio che mi hai dato, l'ho usato e funziona alla grande; però ho il seguente problema:
nel datagrid dovrei inserire un campo che contiene l'id del record, ma deve essere nascosto; posso usare qualche proprietà presente nell'esempio che mi hi fornito, o devo fare qualcosa di particolare?
Inoltre, posso bloccare la larghezza delle celle?

Ti ringrazio per la pazienza.

Ciao
Mauro

AntCiar Profilo | Expert

ciao Mauro,
nella tabella che passi come datasource alla griglia puoi metterci dentro tutte le colonne che vuoi. per visualizzare solo quelle che servono all'utente basta che crei tanti blocchi come quelli che ho postato in fondo al testo, opportunamente collegati, ed il gioco è fatto. Dalla datagrid in questo modo puoi accedere anche ai campi nascosti tramite il datasource della griglia. Mi spiego meglio:

se hai una tabella con i seguenti campi: ID, Nome, Cognome, Città, Provincia
allora crei i blocchi di visualizzazione solo per le colonne nome, Cognome Città, Provincia
Supponiamo che la tabella contenga 20 record e sulla griglia ti sei posizionato all'intenrno del record 5
Per risalire al valore del campo ID del record 5 puoi utilizzare 'datagrid1.datasource.rows(datagrid1.currentrowindex)("ID")'
In questo modo ottieni il valore di ID.
C'è solo una piccola precisazione da fare. La datagrid possiede una propirietà particolare che ti permette di ordinare i dati visualizzati per colonna facendo semplicemente un click sull'intestazione della colonna per cui vuoi ordinare.
Questa operazione ordina a video le righe ma NON nella sorgente dati. Questo significa che l'indice della riga selezionata all'interno della datagrid potrebbe non corrispondere all'indice di riga del datasource.
Se vuoi rimanere questa funzione di ordinamento righe abilitata , allora ti consiglio di inserire all'interno della visualizzazione della griglia anche le colonne che non vuoi vedere, dandogli come larghezza di colonna il valore 0, in modo da accedere al valore di ID tramite il valore presente all'interno della cella.

per quanto riguarda la dimensione delle colonne, non ho trovato nessun evento che viene generato quando si cambia la dimensione delle colonne. Per ovviare al problema io ho fatto in questo modo:
ho nascosto le instestazioni delle colonne e ho gestito l'evento CurrentCellChanged della datagrid. All'interno dell'evento ho impostato ia proprietà Text la Caption (riga blu in alto alla griglia) sul nome della colonna relativa alla cella su cui ero posizionato.

Inoltre ho gestito anche l'evento Resize della griglia in modo da settare la dimensione in modo proporzionale alla dimensione totale della griglia



---- blocco per la visualizzazione di una singola colonna ---
ColumnStyleGen = New DataGridTextBoxColumn()
ColumnStyleGen.MappingName = pippo.campo1
ColumnStyleGen.HeaderText = testo visualizzato come intestazione di colonna
ColumnStyleGen.Width = 50 'larghezza della colonna
DataGridTableStyleGen.GridColumnStyles.Add(ColumnStyleGen)
---------------------------------------------------------------------


genuxmax Profilo | Newbie

Ciao Cristian,
ti ringrazio nuovamente per l'interessamento e devo dire che l'idea di mettere la dimensione della cella a zero mi alletta molto. Userò questa soluzione anche perchè mi sembra la più affidabile dovendo lasciare la possibilità di ordinare i campi in base alla propria preferenza.
Sempre riguardo la formattazione dei campi nel datagrid, mi sono dimenticato di chederti se sai come si può formattare una campo contenente una data. Nel datagrid mi viene visualizzata la data e l'ora, anche se nella tabella ho definito che la visualizzazione deve essere dd/mm/yyyy.
Ho provato ad utilizzare la funzione format, ma nel datagrid non mi viene visualizzato il campo.
Se hai qualche suggerimento te ne sarei molto grato.

Ciao e grazie ancora!
Mauro

AntCiar Profilo | Expert

ciao Mauro
Il format non fonziona perchè restituisce una stringa, mentre il tuo campo va trovando un tipo Data.
Sinceramente non saprei come fare per ovviare al problema. Una soluzione non breve da implementare sarebbe quella di riempire la tabella in VBNet manualmente, ossia con un datareader e imposatre la colonna conentente la data come colonna di tipo stringa ed effettuare il format. Non so se poi hai problemi con l'update del dataset (nel caso li utilizzi)

ti posto il codice per il datareader e per la creazione della tabella
Cristian


Dim Tab as new datatable
Dim Row as datarow
Dim i as integer

If Tab.Columns.Count = 0
Tab.column.add("Nome Colonna 1" , system.gettype("tipo"))
Tab.column.add("Nome Colonna 2", system.gettype("tipo"))
Tab.column.add("Nome Colonna 3" system.gettype("tipo"))
....
End If

Dim OleSTR As String
Dim DtReader As System.Data.OleDb.OleDbDataReader
Dim OLECommCim As OleDb.OleDbCommand = DbConnection.CreateCommand

OleSTR = "SELECT ......... FROM ...... WHERE ....."

if Dbconnection.state = closed then
dbconnection.open
end if

OLECommCim.CommandText = OleSTR
DtReader = OLECommCim.ExecuteReader

While DtReader.Read()
Row = Tab.NewRow

for i = 0 to dtreader.fieldcount -1
if dtreader(i) is dbnull.value = false
Row(i) = dtreader(i)
else
row(i) = dbnull.value
end if
next
tab.rows.add(row)
End While
DtReader.Close()

if Dbconnection.state = Open then
dbconnection.Closed
end if

genuxmax Profilo | Newbie

Ciao Cristian,
grazie ancora per avermi risposto.
Avevo pensato alla soluzione che mi hai dato (anche se praticamente non sapevo come fare), ma speravo che si potesse fare in un altro modo, direttamente associando il datagrid al dataset; non vorrei che il caricamento del datagrid diventasse lento. Cercherò di gestire l'update del dataset non direttamente dal datagrid, e speriamo in bene.

Ciao e grazie
Mauro
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