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:

## CourseName ##
## Address ##
## City ## ## State ## ## Zip ##

## PhoneNumber ##
## NoHoles ## Holes
## CourseType ##

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.

Compartilhe este artigo com seus amigos!

Source link

Categories: Wordpress