Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Ao trabalhar com controles modelados, você talvez não saiba até o tempo de execução que modelos você precisa ou que texto ou controles o modelo deve conter.Nesse caso, você pode criar os modelos dinamicamente no código.
Observação: |
|---|
Você pode criar modelos como controles de usuário e ligá-los dinamicamente a controles em sua página.Para obter detalhes, consulte:Como: Criar Templated ASP.NET usuário Controls. |
Você pode criar modelos no código para todos os controles que usam modelos: the DataList, Repeater, GridView, FormView, DetailsViewe outros. Para o controle GridView, você usa modelos para definir colunas em vez dos modelos de layout de linha como para os outros controles.
Observação: |
|---|
Existem algumas diferenças ao criar colunas de modelo para o controle GridView comparando com outros controles modelados.Para obter detalhes, consulte:Criando uma Coluna Personalizada em um Controle GridView do Servidor Web. |
Criando a classe de modelo
Para criar modelos dinâmicos, você cria uma classe de modelo, a qual você pode então instanciar quando necessário.
Para criar uma classe modelo
Crie uma nova classe que implemente a interface System.Web.UI.ITemplate.
Opcionalmente, passe para o construtor da classe um valor que a classe possa usar para determinar que tipo de modelo criar (ItemTemplate, AlternatingItemTemplate, e assim por diante).
Observação:Uma maneira de tipo seguro para passar o tipo de modelo para o construtor é adicionar um parâmetro ao construtor com o tipo ListItemType.A enumeração ListItemType define os tipos de modelo possíveis para Repeater, DataList e outros controles de listas.
Na classe, implemente o método InstantiateIn, que é o membro da interface ITemplate.
Este método oferece uma maneira de inserir uma instância de texto e controles no contêiner especificado.
No método InstantiateIn, crie os controles para o item de modelo, defina suas propriedades e, em seguida, adicione-as à coleção Controls do pai.
Você pode acessar o controle pai por meio da referência passada para o método InstantiateIn.
Observação:Você não pode adicionar texto estático diretamente à coleção Controls, mas você pode criar controles como o controle Literal ou o controle LiteralControl, definir suas propriedades Text e, em seguida, adicionar esses controles à coleção pai.
Para controles que exigem associação de dados, crie e vincule um método para tratar o evento DataBinding do controle.Este evento é gerado após o item de modelo ser criado com todos os seus controles, e ele lhe fornece uma oportunidade para buscar dados e usá-lo em um controle.
Observação:Você não pode incorporar uma expressão de ligação de dados como uma sequência ao criar controles no modelo, como você faz quando define modelos no tempo de design, porque expressões de vinculação de dados são convertidas em código antes que o modelo seja criada.
No manipulador para o evento DataBinding, você tem uma oportunidade de manipular o conteúdo do controle.Normalmente (mas não necessariamente), você busca dados de algum lugar e os atribui à propriedade Text do controle (ou outra propriedade).
Observação:Para obter informações sobre associação de dados em páginas da Web ASP.NET, consulte Acessando Dados com o ASP.NET.
Para adicionar ligação de dados a um modelo dinâmico, você deve seguir estes procedimentos:
Adicione um manipulador de eventos de ligação de dados aos controles criados no modelo.
Crie o manipulador ao qual você está ligando.No manipulador, obtenha os dados que você deseja ligar e atribua-os à propriedade apropriada do controle sendo ligado.
Observação:Se você tiver vários tipos de controles em seus modelos, você precisará criar um manipulador de eventos de ligação de dados diferentes para cada tipo de controle.
O exemplo de código a seguir ilustra uma classe de modelo chamada MyTemplate que implementa a interface ITemplate.A classe MyTemplate define um construtor que aceita um valor de enumeração ListItemType para indicar qual tipo de modelo está sendo criado.Dependendo do tipo de modelo, o código cria tipos diferentes de controles e adiciona-os ao controle PlaceHolder que é então, adicionado à coleção Controls do controle pai.Para ListItemType de Item e AlternatingItem, um manipulador de eventos chamado Item_DataBinding é criado.
A página da Web processada resulta em uma tabela HTML com uma cor de plano de fundo diferente para o modelo de item alternado.
Public Class MyTemplate Implements System.Web.UI.ITemplate Dim templateType As ListItemType Sub New(ByVal type As ListItemType) templateType = type End Sub Public Sub InstantiateIn(ByVal container As System.Web.UI.Control) _ Implements System.Web.UI.ITemplate.InstantiateIn Dim ph As New PlaceHolder() Dim item1 As New Label() Dim item2 As New Label() item1.ID = "item1" item2.ID = "item2" Select Case (templateType) Case ListItemType.Header ph.Controls.Add(New LiteralControl("<table border=""1"">" & _ "<tr><td><b>Category ID</b></td>" & _ "<td><b>Category Name</b></td></tr>")) Case ListItemType.Item ph.Controls.Add(New LiteralControl("<tr><td>")) ph.Controls.Add(item1) ph.Controls.Add(New LiteralControl("</td><td>")) ph.Controls.Add(item2) ph.Controls.Add(New LiteralControl("</td></tr>")) AddHandler ph.DataBinding, New EventHandler(AddressOf Item_DataBinding) Case ListItemType.AlternatingItem ph.Controls.Add(New LiteralControl("<tr bgcolor=""lightblue""><td>")) ph.Controls.Add(item1) ph.Controls.Add(New LiteralControl("</td><td>")) ph.Controls.Add(item2) ph.Controls.Add(New LiteralControl("</td></tr>")) AddHandler ph.DataBinding, New EventHandler(AddressOf Item_DataBinding) Case ListItemType.Footer ph.Controls.Add(New LiteralControl("</table>")) End Select container.Controls.Add(ph) End Sub End Classpublic class MyTemplate : System.Web.UI.ITemplate { System.Web.UI.WebControls.ListItemType templateType; public MyTemplate(System.Web.UI.WebControls.ListItemType type) { templateType = type; } public void InstantiateIn(System.Web.UI.Control container) { PlaceHolder ph = new PlaceHolder(); Label item1 = new Label(); Label item2 = new Label(); item1.ID = "item1"; item2.ID = "item2"; switch (templateType) { case ListItemType.Header: ph.Controls.Add(new LiteralControl("<table border=\"1\">" + "<tr><td><b>Category ID</b></td>" + "<td><b>Category Name</b></td></tr>")); break; case ListItemType.Item: ph.Controls.Add(new LiteralControl("<tr><td>")); ph.Controls.Add(item1); ph.Controls.Add(new LiteralControl("</td><td>")); ph.Controls.Add(item2); ph.Controls.Add(new LiteralControl("</td></tr>")); ph.DataBinding += new EventHandler(Item_DataBinding); break; case ListItemType.AlternatingItem: ph.Controls.Add(new LiteralControl("<tr bgcolor=\"lightblue\"><td>")); ph.Controls.Add(item1); ph.Controls.Add(new LiteralControl("</td><td>")); ph.Controls.Add(item2); ph.Controls.Add(new LiteralControl("</td></tr>")); ph.DataBinding += new EventHandler(Item_DataBinding); break; case ListItemType.Footer: ph.Controls.Add(new LiteralControl("</table>")); break; } container.Controls.Add(ph); } }
Para criar o manipulador para o evento DataBinding
Crie um método que seja parte da sua classe de modelo e seja um parceiro dos outros métodos da classe (como InstantiateIn) ou um método estático (Shared no Visual Basic) da página.O identificador do nome deve corresponder ao nome usado para ligar o evento anterior.
Obtenha uma referência ao objeto DataItem que contém os dados fazendo o seguinte:
Obtenha uma referência para o item de modelo, que pode ser obtido da propriedade NamingContainer do controle.
Use essa referência para obter a propriedade DataItem do contêiner de nomeação (do item de modelo).
Extraia o elemento de dados individuais do objeto DataItem e use-o para definir uma propriedade do controle que estiver vinculando.
O exemplo de código a seguir ilustra uma maneira de executar ligação de dados em um modelo dinâmico .Ele mostra um manipulador de eventos de ligação de dados completo para o controle PlaceHolder e para os controles Literal e Label criados no procedimento anterior.O manipulador de eventos é implementado como um método estático da página.
Shared Sub Item_DataBinding(ByVal sender As Object, ByVal e As System.EventArgs) Dim ph As PlaceHolder = CType(sender, PlaceHolder) Dim ri As RepeaterItem = CType(ph.NamingContainer, RepeaterItem) Dim item1Value As Integer = _ Convert.ToInt32(DataBinder.Eval(ri.DataItem, "CategoryID")) Dim item2Value As String = _ Convert.ToString(DataBinder.Eval(ri.DataItem, "CategoryName")) CType(ph.FindControl("item1"), Label).Text = item1Value.ToString() CType(ph.FindControl("item2"), Label).Text = item2Value End Substatic void Item_DataBinding(object sender, System.EventArgs e) { PlaceHolder ph = (PlaceHolder)sender; RepeaterItem ri = (RepeaterItem)ph.NamingContainer; Int32 item1Value = (Int32)DataBinder.Eval(ri.DataItem, "CategoryID"); String item2Value = (String)DataBinder.Eval(ri.DataItem, "CategoryName"); ((Label)ph.FindControl("item1")).Text = item1Value.ToString(); ((Label)ph.FindControl("item2")).Text = item2Value; }
Usando o modelo dinâmico
Quando você tem um modelo dinâmico disponível, você pode criar instância dele em código.
Para usar um modelo dinâmico
Crie uma instância do modelo dinâmico, passando-lhe um valor de tipo de item se apropriado.
Atribua a instância a uma das propriedades de modelo do controle modelado, como as propriedades ItemTemplate, AlternatingItemTemplate, ou HeaderTemplate.
O exemplo de código a seguir mostra como usar o modelo dinâmico com um controle Repeater.Nesse exemplo, os modelos são instanciados enquanto a página está sendo carregada e antes que o controle seja vinculado a sua fonte de dados.
O exemplo abaixo assume que você pode se conectar ao banco de dados exemplo Northwind no Microsoft SQL Server 7.0 ou posterior.Ele retorna uma lista de registros da tabela Categorias.
Protected Sub Page_Load(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles MyBase.Load Dim conn As New System.Data.SqlClient.SqlConnection( _ ConfigurationManager.ConnectionStrings("Northwind").ConnectionString) Dim sqlDataAdapter1 As System.Data.SqlClient.SqlDataAdapter Dim dsCategories1 As System.Data.DataSet sqlDataAdapter1 = New System.Data.SqlClient.SqlDataAdapter( _ "SELECT [CategoryID], [CategoryName] FROM [Categories]", conn) dsCategories1 = New System.Data.DataSet() Repeater1.HeaderTemplate = New MyTemplate(ListItemType.Header) Repeater1.ItemTemplate = New MyTemplate(ListItemType.Item) Repeater1.AlternatingItemTemplate = New MyTemplate(ListItemType.AlternatingItem) Repeater1.FooterTemplate = New MyTemplate(ListItemType.Footer) sqlDataAdapter1.Fill(dsCategories1, "Categories") Repeater1.DataSource = dsCategories1.Tables("Categories") Repeater1.DataBind() End Subprotected void Page_Load(object sender, EventArgs e) { System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection( ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString); System.Data.SqlClient.SqlDataAdapter sqlDataAdapter1; System.Data.DataSet dsCategories1; sqlDataAdapter1 = new System.Data.SqlClient.SqlDataAdapter( "SELECT [CategoryID], [CategoryName] FROM [Categories]", conn); dsCategories1 = new System.Data.DataSet(); Repeater1.HeaderTemplate = new MyTemplate(ListItemType.Header); Repeater1.ItemTemplate = new MyTemplate(ListItemType.Item); Repeater1.AlternatingItemTemplate = new MyTemplate(ListItemType.AlternatingItem); Repeater1.FooterTemplate = new MyTemplate(ListItemType.Footer); sqlDataAdapter1.Fill(dsCategories1, "Categories"); Repeater1.DataSource = dsCategories1.Tables["Categories"]; Repeater1.DataBind(); }
Executando o exemplo concluído
Após criar todos os componentes listados anteriormente, adicione um controle Repeater chamado Repeater1 para a marcação de página e execute a página.O código completo e a marcação para a página da Web (usando o modelo de código de arquivo único) são mostrados abaixo.
<%@ Page Language="VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script >
Public Class MyTemplate
Implements System.Web.UI.ITemplate
Dim templateType As ListItemType
Sub New(ByVal type As ListItemType)
templateType = type
End Sub
Public Sub InstantiateIn(ByVal container As System.Web.UI.Control) _
Implements System.Web.UI.ITemplate.InstantiateIn
Dim ph As New PlaceHolder()
Dim item1 As New Label()
Dim item2 As New Label()
item1.ID = "item1"
item2.ID = "item2"
Select Case (templateType)
Case ListItemType.Header
ph.Controls.Add(New LiteralControl("<table border=""1"">" & _
"<tr><td><b>Category ID</b></td>" & _
"<td><b>Category Name</b></td></tr>"))
Case ListItemType.Item
ph.Controls.Add(New LiteralControl("<tr><td>"))
ph.Controls.Add(item1)
ph.Controls.Add(New LiteralControl("</td><td>"))
ph.Controls.Add(item2)
ph.Controls.Add(New LiteralControl("</td></tr>"))
AddHandler ph.DataBinding, New EventHandler(AddressOf Item_DataBinding)
Case ListItemType.AlternatingItem
ph.Controls.Add(New LiteralControl("<tr bgcolor=""lightblue""><td>"))
ph.Controls.Add(item1)
ph.Controls.Add(New LiteralControl("</td><td>"))
ph.Controls.Add(item2)
ph.Controls.Add(New LiteralControl("</td></tr>"))
AddHandler ph.DataBinding, New EventHandler(AddressOf Item_DataBinding)
Case ListItemType.Footer
ph.Controls.Add(New LiteralControl("</table>"))
End Select
container.Controls.Add(ph)
End Sub
End Class
Shared Sub Item_DataBinding(ByVal sender As Object, ByVal e As System.EventArgs)
Dim ph As PlaceHolder = CType(sender, PlaceHolder)
Dim ri As RepeaterItem = CType(ph.NamingContainer, RepeaterItem)
Dim item1Value As Integer = _
Convert.ToInt32(DataBinder.Eval(ri.DataItem, "CategoryID"))
Dim item2Value As String = _
Convert.ToString(DataBinder.Eval(ri.DataItem, "CategoryName"))
CType(ph.FindControl("item1"), Label).Text = item1Value.ToString()
CType(ph.FindControl("item2"), Label).Text = item2Value
End Sub
Protected Sub Page_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Dim conn As New System.Data.SqlClient.SqlConnection( _
ConfigurationManager.ConnectionStrings("Northwind").ConnectionString)
Dim sqlDataAdapter1 As System.Data.SqlClient.SqlDataAdapter
Dim dsCategories1 As System.Data.DataSet
sqlDataAdapter1 = New System.Data.SqlClient.SqlDataAdapter( _
"SELECT [CategoryID], [CategoryName] FROM [Categories]", conn)
dsCategories1 = New System.Data.DataSet()
Repeater1.HeaderTemplate = New MyTemplate(ListItemType.Header)
Repeater1.ItemTemplate = New MyTemplate(ListItemType.Item)
Repeater1.AlternatingItemTemplate = New MyTemplate(ListItemType.AlternatingItem)
Repeater1.FooterTemplate = New MyTemplate(ListItemType.Footer)
sqlDataAdapter1.Fill(dsCategories1, "Categories")
Repeater1.DataSource = dsCategories1.Tables("Categories")
Repeater1.DataBind()
End Sub
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
<title>Dynamically Creating Templates</title>
</head>
<body>
<form id="form1" >
<div>
<asp:Repeater id="Repeater1" ></asp:Repeater>
</div>
</form>
</body>
</html>
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script >
public class MyTemplate : System.Web.UI.ITemplate
{
System.Web.UI.WebControls.ListItemType templateType;
public MyTemplate(System.Web.UI.WebControls.ListItemType type)
{
templateType = type;
}
public void InstantiateIn(System.Web.UI.Control container)
{
PlaceHolder ph = new PlaceHolder();
Label item1 = new Label();
Label item2 = new Label();
item1.ID = "item1";
item2.ID = "item2";
switch (templateType)
{
case ListItemType.Header:
ph.Controls.Add(new LiteralControl("<table border=\"1\">" +
"<tr><td><b>Category ID</b></td>" +
"<td><b>Category Name</b></td></tr>"));
break;
case ListItemType.Item:
ph.Controls.Add(new LiteralControl("<tr><td>"));
ph.Controls.Add(item1);
ph.Controls.Add(new LiteralControl("</td><td>"));
ph.Controls.Add(item2);
ph.Controls.Add(new LiteralControl("</td></tr>"));
ph.DataBinding += new EventHandler(Item_DataBinding);
break;
case ListItemType.AlternatingItem:
ph.Controls.Add(new LiteralControl("<tr bgcolor=\"lightblue\"><td>"));
ph.Controls.Add(item1);
ph.Controls.Add(new LiteralControl("</td><td>"));
ph.Controls.Add(item2);
ph.Controls.Add(new LiteralControl("</td></tr>"));
ph.DataBinding += new EventHandler(Item_DataBinding);
break;
case ListItemType.Footer:
ph.Controls.Add(new LiteralControl("</table>"));
break;
}
container.Controls.Add(ph);
}
}
static void Item_DataBinding(object sender, System.EventArgs e)
{
PlaceHolder ph = (PlaceHolder)sender;
RepeaterItem ri = (RepeaterItem)ph.NamingContainer;
Int32 item1Value = (Int32)DataBinder.Eval(ri.DataItem, "CategoryID");
String item2Value = (String)DataBinder.Eval(ri.DataItem, "CategoryName");
((Label)ph.FindControl("item1")).Text = item1Value.ToString();
((Label)ph.FindControl("item2")).Text = item2Value;
}
protected void Page_Load(object sender, EventArgs e)
{
System.Data.SqlClient.SqlConnection conn =
new System.Data.SqlClient.SqlConnection(
ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString);
System.Data.SqlClient.SqlDataAdapter sqlDataAdapter1;
System.Data.DataSet dsCategories1;
sqlDataAdapter1 = new System.Data.SqlClient.SqlDataAdapter(
"SELECT [CategoryID], [CategoryName] FROM [Categories]", conn);
dsCategories1 = new System.Data.DataSet();
Repeater1.HeaderTemplate = new MyTemplate(ListItemType.Header);
Repeater1.ItemTemplate = new MyTemplate(ListItemType.Item);
Repeater1.AlternatingItemTemplate =
new MyTemplate(ListItemType.AlternatingItem);
Repeater1.FooterTemplate = new MyTemplate(ListItemType.Footer);
sqlDataAdapter1.Fill(dsCategories1, "Categories");
Repeater1.DataSource = dsCategories1.Tables["Categories"];
Repeater1.DataBind();
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
<title>Dynamically Creating Templates</title>
</head>
<body>
<form id="form1" >
<div>
<asp:Repeater id="Repeater1" ></asp:Repeater>
</div>
</form>
</body>
</html>