Il datagrid è come ormai tutti sappiamo uno strumento molto potente per la visualizzazione di dati semplici o complessi.
Una sua caratteristica molto interessante, oltre alla possibilità di poter formattare le sue colonne dinamicamente, consiste nella possibilità di "costruirlo" a runtime, aggiungendo le colonne in base a condizioni da valutare al momento dell'esecuzione.
Inoltre a runtime è possibile sfruttare il metodo LoadTemplate fornito dalla classe Page, per caricare controlli più complessi ai quali associare dati.
Questo da' la possibilità al programmatore di poter visualizzare su uno stesso datagrid dati differenti a seconda delle necessità, come mostrare ad utenti diversi dati con struttura differente ma sempre della stessa base dati.
La pagina contiene un controllo Button per ogni utente, alla cui pressione viene generato l'evento Click. Si definiscono quali campi devono essere visualizzati per l'utente, assegnando anche uno stile particolare:
Private Sub bt_UserA_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bt_UserA.Click Dim Campi(1) As String Campi(0) = "Nome" Campi(1) = "Cognome" dg_Clienti.CssClass = "Style_UserA" CaricaDG(Campi) End Sub
Successivamente viene chiamata la routine CaricaDG che genera gli oggetti BoundColumn o TemplateColumn (ed in questo caso carica anche il template) attraverso le funzioni AddBoundColumn e AddTemplateColumn:
Private Sub CaricaDG(ByVal Campi() As String) Dim Cont As Int16 With dg_Clienti 'IMPOSTO IL CARICAMENTO MANUALE DELLE COLONNE DEL DATAGRID .AutoGenerateColumns = False 'CARICO LE COLONNE SPECIFICHE A ECONDA DELL'UTENTE For Cont = 0 To UBound(Campi) Select Case Campi(Cont) Case "Nome" .Columns.Add(AddBoundColumn("Nome Cliente", _ dt_DatiClienti.Columns("Nome"))) Case "Cognome" .Columns.Add(AddBoundColumn("Cognome Cliente", _ dt_DatiClienti.Columns("Cognome"))) Case "E_Mail" .Columns.Add(AddTemplateColumn("E_MAIL", _ dt_DatiClienti.Columns("E_Mail"), "MailControl.ascx")) Case "DataNascita" .Columns.Add(AddBoundColumn("Data di Nascita", _ dt_DatiClienti.Columns("DataNascita"))) End Select Next 'ESEGUO IL BINDIG .DataSource = dt_DatiClienti .DataBind() End With End Sub Private Function AddBoundColumn(ByVal Etichetta As String, ByVal DataField_O As DataColumn) As Object Dim C_new As New BoundColumn() C_new.HeaderText = Etichetta C_new.DataField = DataField_O.ColumnName ' Campo C_new.Visible = True 'FORMATTO IL VALORE IN BASE AL TIPO Select Case True Case DataField_O.DataType Is GetType(System.DateTime) C_new.DataFormatString = "{0:d}" Case DataField_O.DataType Is GetType(System.String) C_new.DataFormatString = "{0}" End Select AddBoundColumn = C_new End Function Private Function AddTemplateColumn(ByVal Etichetta As String, ByVal DataField_O As DataColumn, ByVal NomeTamplate As String) As Object Dim CT_new As New TemplateColumn() CT_new.HeaderText = "E_MAIL" CT_new.Visible = True 'CARICO IL TEMPLATE CT_new.ItemTemplate = Page.LoadTemplate(NomeTamplate) AddTemplateColumn = CT_new End Function
Ovviamente l'esempio è molto banale ma serve a come gestire totalmente il datagrid a runtime, costruendolo in base alle necessità che sorgono durante l'esecuzione dell'applicazione.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.