Aggiungere colonne al DataGrid a runtime

di Gabriele Cereti, in UserScript, ASP.NET, ADO.NET,

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

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi