Un custom control per tagliare il testo delle colonne di un DataGrid

di Dominique Trossat, in UserScript, ASP.NET, ADO.NET,

L'utilizzo del text-overflow in un DataGrid non si può fare applicando semplicemente una CssClass alla colonne: richiede la definizione di una TemplateColumn nella quale si deve inserire un ItemTemplate che contiene un Literal nel quale scriveremo un tag html (nobr o span o div), all'interno del quale metteremo finalmente l'informazione.
Ecco un esempio:

<asp:TemplateColumn SortExpression="soggetto" HeaderText="Soggetto" >
<ItemTemplate>
<asp:Literal>
<nobr style="overflow:hidden; text-overflow:ellipsis; white-space:nowrap; width: 200px" title="<%# DataBinder.Eval(container.DataItem, "soggetto") %>">
<%# DataBinder.Eval(container.DataItem, "soggetto") %>
</nobr>
</asp:Literal>
</ItemTemplate>
</asp:TemplateColumn>

Un modo più semplice e flessibile consiste nell'utilizzare una piccola classe ITemplate come segue, che può essere richiamata in qualsiasi Datagrid specificando la larghezza della colonna e il campo dati da usare:

Public Class ItemOverflow
  Implements ITemplate
  Dim column As String ' nome della colonna dati
  Dim larghezza As Integer ' larghezza della colonna del datagrid

  ' implementa un ItemTemplate per una colonna di testo in un datagrid:
  ' visualizza solo la parte di testo che corrisponde alla larghezza indicata
  ' con funzione di ellipsis (... alla fine del testo tagliato), 
  ' e visualizza il testo completo quando il mouse si ferma sopra la cella
  ' USO :
  '1- creare una colonna Template nel datagrid:
  ' <asp:TemplateColumn  SortExpression="soggetto" HeaderText="Soggetto" />
  '2- inserire nel Page_init la creazione del contenuto della colonna:
  ' dim posCol as integer= 5 'se la colonna è la sesta del datagrid
  ' Dim itov As New ItemOverflow("soggetto", 200)
  ' Dim tempcol As TemplateColumn = CType(elenco.Columns(posCol), TemplateColumn)
  ' tempcol.ItemTemplate = itov

  Public Sub New(ByVal colonna As String, ByVal larg As Integer)
    Me.column = colonna
    Me.larghezza = larg
  End Sub

  Public Sub InstantiateIn(ByVal container As System.Web.UI.Control) Implements System.Web.UI.ITemplate.InstantiateIn
    Dim l As New Literal
    AddHandler l.DataBinding, AddressOf bindData
    container.Controls.Add(l)
  End Sub

  Public Sub bindData(ByVal sender As Object, ByVal e As System.EventArgs)
    Dim l As Literal = DirectCast(sender, Literal)
    Dim container As DataGridItem = DirectCast(l.NamingContainer, DataGridItem)
    Dim campo As String = DataBinder.Eval(container.DataItem, column)
    l.Text = "<nobr style=""overflow:hidden; text-overflow:ellipsis; white-space:nowrap; width: " & larghezza.ToString() & "px"" title=""" & campo & """ > "
    l.Text &= campo & "</nobr>"
  End Sub
End Class

L'esempio può essere esteso a qualsiasi altra personalizzazione delle colonne del DataGrid.

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