Quero agradecer ao TRINUG , meu grupo de usuários local, por ser o apresentador principal na noite passada. Falei sobre como levar os controles de dados como GridView, Datalist e Repeater para outro nível. Eu meio que fiz uma progressão de criação e controle de layouts personalizados nos controles de dados. Isso começou com uma revisão de alguns itens básicos, como colunas geradas automaticamente, modelos de colunas vinculadas e o uso de modelos personalizados.
Eu queria tirar alguns minutos para postar algumas informações sobre o uso de modelos definidos personalizados e meu maneira de’trair’nisso. Primeiro, acho que vou começar explicando o que faremos. Em qualquer um dos controles de dados que você definir seu layout de linha em um Template, pode ser um Itemtemplate, AlternatingItemTemplate, Headertemplate, Pagertemplate ou FootTemplate. Você pode fazer da maneira mais difícil e achar que está fazendo do jeito fácil, mas quero mostrar como fazer da maneira mais fácil e seus colegas vão pensar que você é um gênio.
O grande segredo está em aprender a utilizar a interface ITemplate. Essa interface pode ser implementada em suas classes para definir o layout e a população de qualquer controle de servidor ASP.NET modelado, como os controles de dados.
O ITemplate tem um método público, InstantiateIn. Este método possui um parâmetro que é passado a ele, uma referência ao controle ao qual o modelo pertence, como um DataListItem. O DataListItem é na verdade um controle para a linha na DataList que está sendo carregada. Seria um DataGridItem em um dataGrid e assim por diante.
O que eu faço com este evento é colocar um painel no container. Você pode usar vários outros controles, como um espaço reservado
Public Class MyCustomTemplate
Implementa ITemplate
Dim WithEvents p As Panel
Public Sub InstantiateIn (ByVal container As System.Web.UI.Control) Implementa System.Web.UI.ITemplate.InstantiateIn
p=Novo painel
container.Controls.Add (p)
End Sub
End Class
Primeiro, defino um painel no nível da classe, p. Isso é feito para que eu possa acessar os eventos do painel em qualquer lugar da classe que eu precisar. Portanto, adicionei um método em minha classe CustomTemplate para manipular o evento databind do painel. Neste método, pego uma referência ao DataListItem da linha e crio um Literal. Em seguida, obtenho uma referência ao dataitem para que possa vincular meus dados. Então, obtenho um modelo predefinido para renderizar os dados da maneira que desejo. É aqui que eu fico imaginando e facilito as coisas. Não gosto de construir manualmente meu layout no código por trás, em vez disso, gosto de mesclar um layout com os dados corretos. Então, crio um arquivo de texto, diga mydatatemplate.htm e o carrego em tempo de execução. Eu realmente gosto de armazená-lo em cache na primeira vez que é carregado, mas você pode fazer o que quiser. Então, vamos analisar um:
|
|
|||||||
O modelo de linha é carregado em uma operação básica de leitura de arquivo (abaixo). Para produção, eu colocaria isso no cache do aplicativo para não ter que recarregá-lo continuamente, mas quero mantê-lo simples aqui. Ah, e eu não codificaria o caminho, mas, novamente, isso é para uma demonstração.
Public ReadOnly Property ctFrame () As String
Get
Dim FILE_NAME As String=’c: \ inetpub \ wwwroot \ datademo \ mydatatemplate.htm’
Dim output As String=”
If Not File.Exists (FILE_NAME) Then
Retornar a saída
End If
Usando sr As StreamReader=File.OpenText (FILE_NAME)
output=sr.ReadToEnd
sr.Close ()
End Using
Retornar saída
End Get
End Property
Este é um para a conjunto de dados que define um Campo de golfe , mas você pode fazer o que quiser. Eu delinio os campos para realizar a mesclagem com um # duplo em cada lado. Mencionei uma classe de informação para conter os dados que definem meu objeto de dados, como um campo de golfe. Eu os gero a partir de modelos CodeSmith que criei para o meu gosto, mas é claro que você poderia fazer isso manualmente, se quisesse. Então eu gero um método chamado Merge na classe Info que faz um Replace em cada um dos campos do template para mim. Para ser um pouco mais avançado, eu poderia expandir isso para diferentes campos de mesclagem para indicar hiperlinks, imagens, etc.
Junção de função pública (ByVal sMessage As String) As String
sMessage=sMessage.Replace (‘## CourseId ##’, CourseId)
sMessage=sMessage.Replace (‘## CourseName ##’, CourseName)
sMessage=sMessage.Replace (‘## Address ##’, Address)
sMessage=sMessage.Replace (‘## City ##’, City)
sMessage=sMessage.Replace (‘## State ##’, State)
sMessage=sMessage.Replace (‘## Zip ##’, Zip)
sMessage=sMessage.Replace (‘## PhoneNumber ##’, PhoneNumber)
sMessage=sMessage.Replace (‘## NoHoles ##’, NoHoles)
sMessage=sMessage.Replace (‘## CourseType ##’, CourseType)
sMessage=sMessage.Replace (‘## GreensFees ##’, GreensFees)
sMessage=sMessage.Replace (‘## AdvTeeOpt ##’, AdvTeeOpt)
Retornar sMessage
End Funct ion
Então, quando colocamos tudo isso junto, capturamos o evento DataBind do Painel para eliminar o layout da linha com os dados mesclados nele. No manipulador de eventos, declaro um literal, recebo o DatListItem (o controle que representa a linha), o modelo (ctFrame) e o CourseInfo (o DataItem). Aprendi que é bom verificar se essas coisas estão realmente instanciadas e envolvê-las em um Try Catch. Basicamente, você apenas executa a mesclagem no layout e define o texto do literal para o layout mesclado. Em seguida, adiciono o Literal aos controles no painel e pronto.
Public Sub BindData (ByVal sender As Object, ByVal e As EventArgs) Manipula p.DataBinding
Dim l As New Literal
Dim container As DataListItem=CType (p.NamingContainer, DataListItem)
Dim sFrame As String=ctFrame
Dim ci As CourseInfo=CType (container. DataItem, CourseInfo)
Tente
If IsNothing (ci)=False Then
l.Text=ci.Merge (ctFrame)
p.Controls.Add (l)
End If
Catch ex As Exception
End Try
End Sub
Esta é uma maneira muito fácil de ajudar a agilizar seus layouts de controle de dados para tornar mais fácil alterar o layout.