Freigeben über


Gewusst wie: Anpassen der Darstellung und des Verhaltens von Datenfeldern in einem Dynamic Data-Steuerelement

Aktualisiert: November 2007

ASP.NET Dynamic Data verwendet Feldvorlagen, um jedes Datenfeld einer Tabelle zu rendern. Bei Feldvorlagen handelt es sich in der Regel um Benutzersteuerelemente (ASCX-Dateien), die CLR-Datentypen zugeordnet werden, die durch den Datenbankdatentyp festgelegt werden. Im Allgemeinen stellt ASP.NET Dynamic Data ein Steuerelement zum Anzeigen von Daten jedes Typs und ein weiteres zum Ändern oder Einfügen von Daten für diesen Typ bereit.

In diesem Thema wird erläutert, wie die Darstellung und das Verhalten eines Datenfelds angepasst werden, indem die UIHint-Eigenschaft in einem Dynamic Data-Steuerelement, z. B. im DynamicControl-Steuerelement, und im DynamicField-Feld festgelegt wird. Die UIHint-Eigenschaft gibt an, welche Feldvorlage verwendet werden soll, wenn ein bestimmtes Datenfeld durch eines dieser Objekte gerendert wird. Die UIHint-Eigenschaft kann auf eine der bereitgestellten Vorlagen oder eine neue, von Ihnen erstellte Vorlage verweisen. Diese Vorgehensweise ist nützlich, wenn Sie keine Seiten verwenden, die automatisch von Dynamic Data erstellt werden, sondern wenn Sie stattdessen benutzerdefinierte Webseiten zum Anzeigen und Bearbeiten von Daten erstellen.

Alternativ können Sie die Anzeige und die Darstellung für das Datenfeld in der gesamten Anwendung mithilfe von Attributen ändern. Weitere Informationen hierzu finden Sie unter Gewusst wie: Anpassen der Darstellung und des Verhaltens von Datenfeldern im Datenmodell.

So passen Sie die Darstellung und das Verhalten eines Datenfelds in einem datengebundenen Steuerelement an

  1. Erstellen Sie optional eine benutzerdefinierte Feldvorlage, die die Benutzeroberfläche für ein bestimmtes Datenfeld im Datenmodell definiert. Weitere Informationen finden Sie unter Gewusst wie: Anpassen der Datenfeldanzeige im Datenmodell.

  2. Wenn Sie das GridView-Steuerelement oder das DetailsView-Steuerelement verwenden, fügen Sie ein DynamicField-Objekt hinzu, und legen Sie dessen UIHint-Eigenschaft auf den Namen der Feldvorlage fest, die zum Anzeigen der Daten verwendet werden soll.

    Im folgenden Beispiel wird veranschaulicht, wie ein DynamicField-Steuerelement verwendet wird, um die Spalte ProductName mit der Feldvorlage RedText zu rendern. Im Anzeigemodus werden die Daten mit einer Feldvorlage mit dem Namen RedText.ascx angezeigt. Im Bearbeitungs- oder Einfügemodus werden die Daten mit der Feldvorlage RedText_Edit.ascx angezeigt.

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

    Wenn die angegebene Feldvorlage nicht gefunden wird, verwendet Dynamic Data einen Fallbackmechanismus. Weitere Informationen hierzu finden Sie unter Übersicht über ASP.NET Dynamic Data-Feldvorlagen.

  3. Wenn Sie datengebundene Steuerelemente verwenden, die Vorlagen oder Vorlagenfelder verwenden, z. B. das ListView-Steuerelement oder das FormView-Steuerelement, fügen Sie ein DynamicControl-Steuerelement zum Anzeigen der Daten hinzu und legen dessen UIHint-Eigenschaft auf den Namen des anzuzeigenden Datenfelds fest.

    Im folgenden Beispiel wird angegeben, dass die ProductName-Spalte mit der Feldvorlage RedText gerendert wird, wenn sich das Element im Bearbeitungsmodus befindet. Zur Laufzeit sucht Dynamic Data nach einem Benutzersteuerelement mit dem Namen RedText_Edit.ascx.

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

Beispiel

Das folgende Beispiel veranschaulicht, wie die UIHint-Eigenschaft einem DynamicField-Feld eines GridView-Steuerelements hinzugefügt wird. Die Eigenschaft wird so festgelegt, dass das Datenfeld eine benutzerdefinierte Feldvorlage verwendet, die ein Calendar-Steuerelement anzeigt, mit dem das DiscontinuedDate-Feld bearbeitet werden kann. Das zweite und das dritte Beispiel zeigen den Benutzersteuerelementcode für die Feldvorlagen, die die Benutzeroberfläche für die Anzeige des Datums im Kurzformat und zum Bearbeiten des Felds definieren.

<%@ 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" />

Kompilieren des Codes

Dieses Beispiel setzt Folgendes voraus:

  • Eine Dynamic Data-Website oder eine Webanwendung für Dynamic Data.

  • Die Beispieldatenbank AdventureWorks oder AdventureWorksLT. Informationen über das Herunterladen und Installieren der SQL Server-Beispieldatenbank finden Sie auf der CodePlex-Website unter Microsoft SQL Server Product Samples: Database. Vergewissern Sie sich, dass Sie die richtige Version der Beispieldatenbank für die von Ihnen verwendete SQL Server-Version (SQL Server 2005 oder SQL Server 2008) installieren.

  • Eine LINQ to SQL-Klasse, die konfiguriert wird, um auf die Tabelle Products der AdventureWorks- oder der AdventureWorksLT-Datenbank zuzugreifen.

  • Ein Datenkontextobjekt, das für die Verwendung durch Dynamic Data in der Datei Global.asax registriert ist.

Robuste Programmierung

Unter den folgenden Bedingungen kann eine Ausnahme ausgelöst werden:

  • Die Datenbank ist nicht verfügbar.

Siehe auch

Aufgaben

Exemplarische Vorgehensweise: Erstellen einer neuen Dynamic Data-Website mithilfe des Gerüstbaus

Konzepte

Übersicht über ASP.NET Dynamic Data

Übersicht über ASP.NET Dynamic Data-Feldvorlagen

Referenz

DynamicField.UIHint

DynamicControl.UIHint