Compartilhar via


Como: Personalizar a aparência do campo de dados e o comportamento em um controle de dados dinâmicos

Dados dinâmicos do ASP.NET usa modelos de campo para processar cada campo de dados de uma tabela.Modelos de campo geralmente são controles de usuário (arquivos .ascx) que são mapeados para tipos de common linguagem tempo de execução (CLR) dados que determinado pelo tipo de dados do banco de dados.Normalmente, dados dinâmicos do ASP.NET fornece um controle de usuário para exibir dados de cada tipo e outra para modificar ou inserir dados para esse tipo.

Este tópico descreve sistema autônomo personalizar a aparência do campo de dados e o comportamento, definindo o UIHint propriedade em um controle de dados dinâmicos, sistema autônomo o DynamicControl controle e o DynamicField campo. The UIHint propriedade especifica qual modelo de campo a ser usado quando um campo de dados específico é processado por um desses objetos. The UIHint propriedade pode apontar para um dos modelos fornecidos ou para um novo que você criar. Essa abordagem é útil quando você não estiver usando páginas que são criadas automaticamente pelo dados dinâmicos, mas em vez disso, você está criando páginas da Web personalizadas para exibir e edição dados.

Como alternativa, você pode alterar a exibição e a aparência para o campo de dados em todo o aplicativo por meio de atributos.Para obter mais informações, consulte Como: Personalizar dados campo aparência e o comportamento no modelo de dados.

Para personalizar a aparência e comportamento de um campo de dados em um controle limite a dados

  1. Opcionalmente, crie um modelo de campo personalizado que define a interface do usuário para um campo de dados específicos do modelo de dados.Para mais informações, consulte: Como: Personalize a exibição de campo de dados no modelo de dados.

  2. Se você estiver usando o GridView ou DetailsView Adicionar controles, um DynamicField objeto e conjunto seus UIHint propriedade com o nome do modelo de campo a ser usado para exibir os dados.

    O exemplo a seguir mostra como usar um DynamicField o controle para o campo processar a coluna ProductName usando um modelo de campo chamado RedText. No modo de exibição, os dados são exibidos usando um modelo de campo chamado RedText.ascx.Em edição ou modo de inserção, os dados são exibidos usando um modelo de campo chamado RedText_Edit.ascx.

    <asp:DynamicField
      UIHint="RedText"
      DataField="ProductName" />
    
    Observação:

    Se o modelo de campo especificado não for encontrado, Dados dinâmicos usa um mecanismo de fallback.Para obter mais informações, consulte Visão geral do ASP.NET dinâmico dados campo modelos.

  3. Se você estiver usando sistema autônomo controles ligados a dados que usam modelos ou campos de modelo, sistema autônomo a ListView ou o FormView Adicionar controles, um DynamicControl controle para exibir sistema autônomo dados, e conjunto seu UIHint propriedade para o nome do campo para exibir dados.

    O exemplo a seguir especifica que o ProductName coluna será processada usando um modelo de campo chamado RedText Quando o item está no modo de edição. Em time de execução, os dados dinâmicos irá procurar por um controle de usuário chamado RedText_Edit.ascx.

    <EditItemTemplate>
      <asp:DynamicControl 
        Mode="Edit"
        UIHint="RedText"
        DataField="ProductName" />
    </EditItemTemplate>
    

Exemplo

O exemplo a seguir mostra como adicionar o UIHint propriedade para um DynamicField campo de um GridView controle. A propriedade é definida para que o campo de dados usa um modelo de campo personalizado que exibe um Calendar controle de edição data descontinuada. Os exemplos a segundo e terceiro mostram o código de controle de usuário para os modelos de campo que definem a interface do usuário para exibir a data no formato abreviado e edição o campo.

<%@ Page Language="VB" %>

<script >

  Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs)
    DynamicDataManager1.RegisterControl(ProductsGridView)
  End Sub

</script>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" >
    <title>UIHint Property Sample</title>
    <link href="~/Site.css" rel="stylesheet" type="text/css" />
</head>
<body>

  <form id="form1" >
    <div>
      <h2><%= ProductsDataSource.TableName%> table</h2>

      <asp:DynamicDataManager ID="DynamicDataManager1" 
        AutoLoadForeignKeys="true" />

      <asp:ScriptManager ID="ScriptManager1"  EnablePartialRendering="true"/>

      <asp:UpdatePanel ID="UpdatePanel1" >
        <ContentTemplate>        

          <asp:GridView ID="ProductsGridView"  DataSourceID="ProductsDataSource"
            AutoGenerateEditButton="true"
            AutoGenerateColumns="false"
            AllowSorting="true"
            AllowPaging="true">
            <Columns>
              <asp:DynamicField DataField="Name" />
              <asp:DynamicField DataField="ProductNumber" />
              <asp:DynamicField DataField="DiscontinuedDate" UIHint="DateCalendar" />
            </Columns>        
            <EmptyDataTemplate>
              There are currently no items in this table.
            </EmptyDataTemplate>
          </asp:GridView>

          <!-- This example uses Microsoft SQL Server and connects   -->
          <!-- to the AdventureWorksLT sample database.              -->
          <asp:LinqDataSource ID="ProductsDataSource"  
            EnableUpdate="true"
            TableName="Products" 
            ContextTypeName="AdventureWorksLTDataContext" />

          </ContentTemplate>
        </asp:UpdatePanel>

    </div>
  </form>
</body>
</html>
<%@ Page Language="C#" %>

<script >

  protected void Page_Init(object sender, EventArgs e) 
  {
    DynamicDataManager1.RegisterControl(ProductsGridView);
  }

</script>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" >
    <title>UIHint Property Sample</title>
    <link href="~/Site.css" rel="stylesheet" type="text/css" />
</head>
<body>

  <form id="form1" >
    <div>
      <h2><%= ProductsDataSource.TableName%> table</h2>

      <asp:DynamicDataManager ID="DynamicDataManager1" 
        AutoLoadForeignKeys="true" />

      <asp:ScriptManager ID="ScriptManager1"  EnablePartialRendering="true"/>

      <asp:UpdatePanel ID="UpdatePanel1" >
        <ContentTemplate>        

          <asp:GridView ID="ProductsGridView"  DataSourceID="ProductsDataSource"
            AutoGenerateEditButton="true"
            AutoGenerateColumns="false"
            AllowSorting="true"
            AllowPaging="true">
            <Columns>
              <asp:DynamicField DataField="Name" />
              <asp:DynamicField DataField="ProductNumber" />
              <asp:DynamicField DataField="DiscontinuedDate" UIHint="DateCalendar" />
            </Columns>        
            <EmptyDataTemplate>
              There are currently no items in this table.
            </EmptyDataTemplate>
          </asp:GridView>

          <asp:LinqDataSource ID="ProductsDataSource"  
            EnableUpdate="true"
            TableName="Products" 
            ContextTypeName="AdventureWorksLTDataContext" />

          </ContentTemplate>
        </asp:UpdatePanel>

    </div>
  </form>
</body>
</html>
<%@ Control Language="VB" Inherits="System.Web.DynamicData.FieldTemplateUserControl" %>

<script >

  Function GetDateString() As String 
    If Not (FieldValue Is Nothing) Then
      Dim dt As DateTime = CType(FieldValue, DateTime)
      Return dt.ToShortDateString()
    Else
      Return String.Empty
    End If
  End Function
</script>

<%# GetDateString() %>
<%@ Control Language="C#" Inherits="System.Web.DynamicData.FieldTemplateUserControl" %>

<script >
    string GetDateString() 
    {
      if (FieldValue != null)
      {
        DateTime dt = (DateTime)FieldValue;
        return dt.ToShortDateString();
      }
      else
      {
        return string.Empty;
      }
    }
</script>

<%# GetDateString() %>
<%@ Control Language="VB" Inherits="System.Web.DynamicData.FieldTemplateUserControl" %>

<script >

  Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
    TextBox1.ToolTip = Column.Description

    SetUpValidator(RequiredFieldValidator1)
    SetUpValidator(RegularExpressionValidator1)
    SetUpValidator(DynamicValidator1)
  End Sub

  Protected Overrides Sub ExtractValues(ByVal dictionary As IOrderedDictionary)
    dictionary(Column.Name) = ConvertEditedValue(TextBox1.Text)
  End Sub

  Public Overrides ReadOnly Property DataControl() As Control
    Get
      Return TextBox1
    End Get
  End Property

  Protected Sub Calendar1_SelectionChanged(ByVal sender As Object, ByVal e As System.EventArgs)
    TextBox1.Text = Calendar1.SelectedDate.ToString("d")
  End Sub

  Function GetDateString() As String
    If Not (FieldValue Is Nothing) Then
      Dim dt As DateTime = CType(FieldValue, DateTime)
      Return dt.ToShortDateString()
    Else
      Return String.Empty
    End If
  End Function

</script>

<asp:TextBox ID="TextBox1"  
  Text='<%# GetDateString() %>' 
  MaxLength="10">
</asp:TextBox>

<asp:Calendar ID="Calendar1"  
  VisibleDate='<%# IIf(FieldValue Is Nothing, DateTime.Now, FieldValue) %>'
  SelectedDate='<%# IIf(FieldValue Is Nothing, DateTime.Now, FieldValue) %>' 
  OnSelectionChanged="Calendar1_SelectionChanged" />

<asp:RequiredFieldValidator  ID="RequiredFieldValidator1" 
  CssClass="droplist" ControlToValidate="TextBox1" Display="Dynamic" Enabled="false" />
<asp:RegularExpressionValidator  ID="RegularExpressionValidator1" 
  CssClass="droplist" ControlToValidate="TextBox1" Display="Dynamic" Enabled="false" />  
<asp:DynamicValidator  ID="DynamicValidator1" 
  CssClass="droplist" ControlToValidate="TextBox1" Display="Dynamic" />
<%@ Control Language="C#" Inherits="System.Web.DynamicData.FieldTemplateUserControl" %>

<script >
    protected void Page_Load(object sender, EventArgs e) {
        TextBox1.ToolTip = Column.Description;

        SetUpValidator(RequiredFieldValidator1);
        SetUpValidator(RegularExpressionValidator1);
        SetUpValidator(DynamicValidator1);
    }

    protected override void ExtractValues(IOrderedDictionary dictionary) {
      dictionary[Column.Name] = ConvertEditedValue(TextBox1.Text);
    }

    public override Control DataControl
    {
      get
      {
        return TextBox1;
      }
    }  

    protected void Calendar1_SelectionChanged(object sender, EventArgs e)
    {
      TextBox1.Text = Calendar1.SelectedDate.ToString("d");
    }

    string GetDateString()
    {
      if (FieldValue != null)
      {
        DateTime dt = (DateTime)FieldValue;
        return dt.ToShortDateString();
      }
      else
      {
        return string.Empty;
      }
    }
</script>

<asp:TextBox ID="TextBox1"  
  Text='<%# GetDateString() %>' 
  MaxLength="10">
</asp:TextBox>

<asp:Calendar ID="Calendar1"  
  VisibleDate='<%# (FieldValue != null) ? FieldValue : DateTime.Now %>'
  SelectedDate='<%# (FieldValue != null) ? FieldValue : DateTime.Now %>'
  OnSelectionChanged="Calendar1_SelectionChanged" />

<asp:RequiredFieldValidator  ID="RequiredFieldValidator1" 
  CssClass="droplist" ControlToValidate="TextBox1" Display="Dynamic" Enabled="false" />
<asp:RegularExpressionValidator  ID="RegularExpressionValidator1" 
  CssClass="droplist" ControlToValidate="TextBox1" Display="Dynamic" Enabled="false" />  
<asp:DynamicValidator  ID="DynamicValidator1" 
  CssClass="droplist" ControlToValidate="TextBox1" Display="Dynamic" />

Compilando o código

Este exemplo requer:

  • Um site dinâmico dados ou um aplicativo Web dinâmico de dados.

  • Talvez o AdventureWorks ou banco de dados de exemplo AdventureWorksLT.Para obter informações sobre como baixar e instalar o exemplo do SQL servidor, consulte Exemplos de produtos do Microsoft SQL servidor: Banco de dados no site da CodePlex.Certifique-se de que você instalar a versão correta do banco de dados de exemplo para a versão do SQL servidor que você está executando (SQL servidor 2005 ou SQL servidor 2008).

  • Uma classe LINQ to SQL configurado para acessar a tabela Produtos de banco de dados AdventureWorks ou AdventureWorksLT.

  • Um objeto de contexto de dados que está registrado para ser usado pelos dados dinâmicos no arquivo global.asax.

Programação robusta

As seguintes condições podem causar uma exceção:

  • O banco de dados não está disponível.

Consulte também

Tarefas

Demonstra Passo a passo: Criando um novo site do Dynamic dados Using a scaffolding

Conceitos

Visão geral de dados dinâmicos do ASP.NET

Visão geral do ASP.NET dinâmico dados campo modelos

Referência

DynamicField.UIHint

DynamicControl.UIHint