Condividi tramite


Procedura: personalizzare l'aspetto e il comportamento dei campi dati di un controllo Dynamic Data

Aggiornamento: novembre 2007

ASP.NET Dynamic Data utilizza modelli di campo per eseguire il rendering di ogni campo dati di una tabella. I modelli di campo sono in genere controlli utente (file ASCX) di cui viene eseguito il mapping a tipi di dati Common Language Runtime (CLR), determinati dal tipo di dati del database. Di solito, ASP.NET Dynamic Data fornisce un controllo utente per la visualizzazione dei dati di ogni tipo e un altro per la modifica o l'inserimento dei dati di tale tipo.

In questo argomento viene descritto come personalizzare l'aspetto e il comportamento di un campo dati mediante l'impostazione della proprietà UIHint in un controllo Dynamic Data quale il controllo DynamicControl e il campo DynamicField. La proprietà UIHint specifica il modello di campo da utilizzare quando viene eseguito il rendering di un campo dati specifico da parte di uno di questi oggetti. La proprietà UIHint può puntare a uno dei modelli forniti o a uno nuovo creato dall'utente. Questo approccio è utile quando non si utilizzano pagine create automaticamente da Dynamic Data, ma si creano pagine Web personalizzate per visualizzare e modificare i dati.

In alternativa, è possibile modificare la visualizzazione e l'aspetto del campo dati in tutta l'applicazione mediante attributi. Per ulteriori informazioni, vedere la classe Procedura: personalizzare l'aspetto e il comportamento dei campi dati nel modello di dati.

Per personalizzare l'aspetto e il comportamento di un campo dati in un controllo con associazione a dati

  1. Se lo si desidera, creare un modello di campo personalizzato che definisca l'interfaccia utente per un campo dati specifico nel modello di dati. Per ulteriori informazioni, vedere Procedura: personalizzare la visualizzazione dei campi dati nel modello di dati.

  2. Se si utilizzano i controlli GridView o DetailsView, aggiungere un oggetto DynamicField e impostarne la proprietà UIHint sul nome del modello di campo da utilizzare per la visualizzazione dei dati.

    Nell'esempio riportato di seguito viene illustrato come utilizzare un controllo DynamicField in un campo per eseguire il rendering della colonna ProductName mediante un modello di campo denominato RedText. In modalità di visualizzazione i dati vengono visualizzati mediante un modello di campo denominato RedText.ascx. In modalità di modifica o di inserimento i dati vengono visualizzati mediante un modello di campo denominato RedText_Edit.ascx.

    <asp:DynamicField
      UIHint="RedText"
      DataField="ProductName" />
    
    Nota:

    Se il modello di campo specificato non viene trovato, Dynamic Data utilizza un meccanismo di fallback. Per ulteriori informazioni, vedere la classe Cenni preliminari sui modelli di campo di ASP.NET Dynamic Data.

  3. Se si utilizzano controlli con associazione a dati che si avvalgono di modelli o di campi modello, ad esempio i controlli ListView o FormView, aggiungere un controllo DynamicControl per visualizzare i dati e impostarne la proprietà UIHint sul nome del campo dati da visualizzare.

    Nell'esempio riportato di seguito viene specificato che verrà eseguito il rendering della colonna ProductName mediante un modello di campo denominato RedText quando l'elemento è in modalità di modifica. In fase di esecuzione Dynamic Data cercherà un controllo utente denominato RedText_Edit.ascx.

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

Esempio

Nell'esempio riportato di seguito viene illustrato come aggiungere la proprietà UIHint a un campo DynamicField di un controllo GridView. La proprietà viene impostata in modo che il campo dati utilizzi un modello di campo personalizzato che visualizza un controllo Calendar per la modifica della data non più disponibile. Nel secondo e terzo esempio viene illustrato il codice del controllo utente per i modelli di campo che definiscono l'interfaccia utente per la visualizzazione della data in formato breve e per la modifica del 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" />

Compilazione del codice

Per questo esempio sono necessari i seguenti requisiti:

  • Sito Web Dynamic Data o applicazione Web Dynamic Data.

  • Database di esempio AdventureWorks o AdventureWorksLT. Per informazioni su come scaricare e installare il database di esempio di SQL Server, vedere Microsoft SQL Server Product Samples: Database (informazioni in lingua inglese) nel sito Web CodePlex. Assicurarsi di installare la versione del database di esempio appropriata per la versione di SQL Server in esecuzione (SQL Server 2005 o SQL Server 2008).

  • Classe LINQ to SQL configurata per l'accesso alla tabella Products del database AdventureWorks o AdventureWorksLT.

  • Oggetto contesto dati registrato per essere utilizzato da Dynamic Data nel file Global.asax.

Programmazione efficiente

Le seguenti condizioni possono generare un'eccezione:

  • Database non disponibile

Vedere anche

Attività

Procedura dettagliata: creazione di un nuovo sito Web Dynamic Data utilizzando le pagine di supporto temporaneo.

Concetti

Cenni preliminari su ASP.NET Dynamic Data

Cenni preliminari sui modelli di campo di ASP.NET Dynamic Data

Riferimenti

DynamicField.UIHint

DynamicControl.UIHint