Gewusst wie: Ermöglichen des Bearbeitens von Elementen in DataList-Webserversteuerelementen

Aktualisiert: November 2007

Sie können zulassen, dass Benutzer einzelne Elemente im DataList-Webserversteuerelement bearbeiten. Ist ein einzelnes Element im Bearbeitungsmodus, werden die Werte, die geändert werden können, normalerweise in Textfeldern oder anderen Steuerelementen angezeigt, in denen der Benutzer seine Änderungen vornehmen kann.

So ermöglichen Sie den Benutzern die Bearbeitung von Elementen in einem DataList-Steuerelement

  1. Legen Sie die DataKeyField-Eigenschaft des DataList-Steuerelements auf den Namen des Felds in den Daten fest, das den Primärschlüssel enthält.

  2. Erstellen Sie eine ItemTemplate (und ggf. eine AlternatingItemTemplate), und fügen Sie ein Button-Webserversteuerelement hinzu. Legen Sie die CommandName-Eigenschaft dieser Schaltfläche auf edit fest.

    Hinweis:

    Sie können bei jedem Schritt, der ein Button-Webserversteuerelement aufruft, ein LinkButton-Steuerelement oder ein ImageButton-Steuerelement verwenden.

  3. Erstellen Sie eine EditItemTemplate für das DataList-Steuerelement, die Folgendes enthält:

    • Steuerelemente für alle Werte, die der Benutzer ändern kann. Fügen Sie beispielsweise für alle Textzeichen- und numerischen Daten TextBox-Steuerelemente ein. Verwenden Sie die deklarative Eval-Methode, um zu bestimmen, an welches Feld jedes einzelne Steuerelement gebunden ist, wie im nachfolgenden Beispiel beschrieben:

      Sicherheitshinweis:

      In diesem Beispiel ist ein Textfeld für eine Benutzereingabe enthalten. Dies stellt ein potenzielles Sicherheitsrisiko dar. Standardmäßig stellt die ASP.NET-Seite sicher, dass die Benutzereingabe keine Skript- oder HTML-Elemente enthält. Weitere Informationen finden Sie unter Übersicht über Skriptangriffe.

      <asp:TextBox ID="TextBox1" 
      
        Text='<%# Eval("ProductName") %>' />
      
    • Ein Button-Steuerelement, bei dem die Text-Eigenschaft auf "Update" und die CommandName-Eigenschaft auf update festgelegt ist (Groß-/Kleinschreibung beachten).

    • Ein Button-Steuerelement, bei dem die Text-Eigenschaft auf "Cancel" und die CommandName-Eigenschaft auf cancel festgelegt ist.

      Mit der Schaltfläche Aktualisieren geben Benutzer an, dass sie mit der Bearbeitung fertig sind und die Änderungen speichern möchten. Die Schaltfläche Abbrechen ermöglicht das Abbrechen der Bearbeitung, ohne die Änderungen zu speichern.

  4. Erstellen Sie Code zum Ausführen der folgenden Aufgaben:

    • Behandeln Sie das EditCommand-Ereignis des DataList-Steuerelements, das die EditItemIndex-Eigenschaft des DataList-Steuerelements auf den Indexwert des Elements festlegt, welches in den Bearbeitungsmodus versetzt werden soll. Der Index des vom Benutzer ausgewählten Elements kann über die ItemIndex-Eigenschaft des Item-Objekts ermittelt werden. Rufen Sie anschließend die DataBind-Methode des Steuerelements auf.

    • Behandeln Sie das CancelCommand-Ereignis des DataList-Steuerelements, das die EditItemIndex-Eigenschaft des DataList-Steuerelements auf -1 festlegt und anschließend die DataBind-Methode des Steuerelements aufruft.

    • Behandeln Sie das UpdateCommand-Ereignis des DataList-Steuerelements. Extrahieren Sie im Code die Werte der Steuerelemente des aktuellen Elements, und übergeben Sie diese zum Aktualisieren an das Datenquellensteuerelement. Der genaue Code hängt vom Typ des Datenquellensteuerelements ab, das Sie verwenden.

Beispiel

Das folgende Beispiel zeigt eine ASP.NET-Seite, die ein DataList-Steuerelement und ein SqlDataSource-Steuerelement verwendet, um Informationen aus der Kategorientabelle der Northwind-Datenbank anzuzeigen. Benutzer können die Elemente bearbeiten.

Sicherheitshinweis:

In diesem Beispiel ist ein Textfeld für eine Benutzereingabe enthalten. Dies stellt ein potenzielles Sicherheitsrisiko dar. Standardmäßig stellt die ASP.NET-Seite sicher, dass die Benutzereingabe keine Skript- oder HTML-Elemente enthält. Weitere Informationen finden Sie unter Übersicht über Skriptangriffe.

<%@ Page Language="VB" %>

<script >
Protected Sub DataList1_EditCommand(ByVal source As Object, _
        ByVal e As System.Web.UI.WebControls.DataListCommandEventArgs)
    DataList1.EditItemIndex = e.Item.ItemIndex
    DataList1.DataBind()
End Sub

Protected Sub DataList1_CancelCommand(ByVal source As Object, _
        ByVal e As System.Web.UI.WebControls.DataListCommandEventArgs)
    DataList1.EditItemIndex = -1
    DataList1.DataBind()
End Sub

Protected Sub DataList1_UpdateCommand(ByVal source As Object, _
        ByVal e As System.Web.UI.WebControls.DataListCommandEventArgs)
    Dim categoryID As String = _
        DataList1.DataKeys(e.Item.ItemIndex).ToString()
    Dim categoryName As TextBox = _
        CType(e.Item.FindControl("textCategoryName"), TextBox)
    Dim description As TextBox = _
        CType(e.Item.FindControl("textDescription"), TextBox)

    SqlDataSource1.UpdateParameters("original_CategoryID"). _
        DefaultValue = categoryID
    SqlDataSource1.UpdateParameters("categoryName"). _
        DefaultValue = categoryName.Text
    SqlDataSource1.UpdateParameters("Description"). _
        DefaultValue = description.Text
    SqlDataSource1.Update()
    DataList1.EditItemIndex = -1
    DataList1.DataBind()
End Sub
</script>

<html>
<head ></head>
<body>
  <form id="form1" >
    <div>
        <br />
        <asp:DataList  
            DataKeyField="CategoryID" 
            DataSourceID="SqlDataSource1" ID="DataList1"
            OnEditCommand="DataList1_EditCommand" 
            OnCancelCommand="DataList1_CancelCommand" 
            OnUpdateCommand="DataList1_UpdateCommand">
            <EditItemTemplate>
                ID: <asp:Label ID="Label1"  
                         Text='<%# Eval("CategoryID") %>'>
                    </asp:Label>
                <br />
                Name: <asp:TextBox ID="textCategoryName"  
                         Text='<%# Eval("CategoryName") %>'>
                      </asp:TextBox>
                <br />
                Description: <asp:TextBox ID="textDescription" 
                                  
                        Text='<%# Eval("Description") %>'>
                     </asp:TextBox>
                <br />
                <asp:LinkButton ID="LinkButton1"  
                    CommandName="update" >
                    Save
                </asp:LinkButton>
                &nbsp;
                <asp:LinkButton ID="LinkButton2" >
                    CommandName="cancel" 
                    Cancel
                </asp:LinkButton>
            </EditItemTemplate>
            <ItemTemplate>
                CategoryID:
                <asp:Label ID="CategoryIDLabel"  
                    Text='<%# Eval("CategoryID") %>'>
                </asp:Label>
                <br />
                CategoryName:
                <asp:Label ID="CategoryNameLabel" 
                     Text='<%# Eval("CategoryName") %>'>
                </asp:Label>
                <br />
                Description:
                <asp:Label ID="DescriptionLabel"  
                    Text='<%# Eval("Description") %>'>
                </asp:Label>
                <br />
                <asp:LinkButton  ID="LinkButton1" 
                    CommandName="edit" >
                    Edit
                </asp:LinkButton><br />
            </ItemTemplate>
        </asp:DataList>

        <asp:SqlDataSource ID="SqlDataSource1"  
              ConnectionString=
                  "<%$ ConnectionStrings:NorthwindConnectionString %>"
            SelectCommand="SELECT [CategoryID], [CategoryName], 
                 [Description] FROM [Categories]"
            UpdateCommand="UPDATE [Categories] SET [CategoryName] = 
                 @CategoryName, [Description] = @Description 
                 WHERE [CategoryID] = @original_CategoryID">
            <UpdateParameters>
              <asp:Parameter Name="CategoryName" Type="String" />
              <asp:Parameter Name="Description" Type="String" />
              <asp:Parameter Name="original_CategoryID" Type="Int32" />
            </UpdateParameters>
        </asp:SqlDataSource>
    </div>
  </form>
</body>
</html>
<%@ Page Language="C#" %>
<script >
protected void DataList1_EditCommand(object source, 
    DataListCommandEventArgs e)
{
    DataList1.EditItemIndex = e.Item.ItemIndex;
    DataList1.DataBind();
}

protected void DataList1_CancelCommand(object source, 
    DataListCommandEventArgs e)
{
    DataList1.EditItemIndex = -1;
    DataList1.DataBind();
}

protected void DataList1_UpdateCommand(object source, 
    DataListCommandEventArgs e)
{
    String categoryID = 
         DataList1.DataKeys[e.Item.ItemIndex].ToString();
    String categoryName = 
         ((TextBox)e.Item.FindControl("textCategoryName")).Text;
    String description = 
         ((TextBox) e.Item.FindControl("textDescription")).Text;

    SqlDataSource1.UpdateParameters["original_CategoryID"].DefaultValue 
        = categoryID;
    SqlDataSource1.UpdateParameters["categoryName"].DefaultValue 
        = categoryName;
    SqlDataSource1.UpdateParameters["Description"].DefaultValue 
        = description;
    SqlDataSource1.Update();

    DataList1.EditItemIndex = -1;
    DataList1.DataBind();
}
</script>
<html>
<head ></head>
<body>
  <form id="form1" >
    <div>
        <br />
        <asp:DataList  
            DataKeyField="CategoryID" 
            DataSourceID="SqlDataSource1" ID="DataList1"
            OnEditCommand="DataList1_EditCommand" 
            OnCancelCommand="DataList1_CancelCommand" 
            OnUpdateCommand="DataList1_UpdateCommand">
            <EditItemTemplate>
                ID: <asp:Label ID="Label1"  
                         Text='<%# Eval("CategoryID") %>'>
                    </asp:Label>
                <br />
                Name: <asp:TextBox ID="textCategoryName"  
                         Text='<%# Eval("CategoryName") %>'>
                      </asp:TextBox>
                <br />
                Description: <asp:TextBox ID="textDescription" 
                                  
                        Text='<%# Eval("Description") %>'>
                     </asp:TextBox>
                <br />
                <asp:LinkButton ID="LinkButton1"  
                    CommandName="update" >
                    Save
                </asp:LinkButton>
                &nbsp;
                <asp:LinkButton ID="LinkButton2" >
                    CommandName="cancel" 
                    Cancel
                </asp:LinkButton>
            </EditItemTemplate>
            <ItemTemplate>
                CategoryID:
                <asp:Label ID="CategoryIDLabel"  
                    Text='<%# Eval("CategoryID") %>'>
                </asp:Label>
                <br />
                CategoryName:
                <asp:Label ID="CategoryNameLabel" 
                     Text='<%# Eval("CategoryName") %>'>
                </asp:Label>
                <br />
                Description:
                <asp:Label ID="DescriptionLabel"  
                    Text='<%# Eval("Description") %>'>
                </asp:Label>
                <br />
                <asp:LinkButton  ID="LinkButton1" 
                    CommandName="edit" >
                    Edit
                </asp:LinkButton><br />
            </ItemTemplate>
        </asp:DataList>

        <asp:SqlDataSource ID="SqlDataSource1"  
              ConnectionString=
                 "<%$ ConnectionStrings:NorthwindConnectionString %>"
            SelectCommand="SELECT [CategoryID], [CategoryName], 
                 [Description] FROM [Categories]"
            UpdateCommand="UPDATE [Categories] SET [CategoryName] = 
                 @CategoryName, [Description] = @Description 
                 WHERE [CategoryID] = @original_CategoryID">
            <UpdateParameters>
               <asp:Parameter Name="CategoryName" Type="String" />
              <asp:Parameter Name="Description" Type="String" />
              <asp:Parameter Name="original_CategoryID" Type="Int32" />
            </UpdateParameters>
        </asp:SqlDataSource>
    </div>
  </form>
</body>
</html>

Um Daten zu aktualisieren, brauchen Sie den Primärschlüssel des Datensatzes, der aktualisiert werden soll. Sie können diesen Wert aus der DataKeyField-Eigenschaft abrufen, die ein Array der Schlüssel enthält.

Um den Wert eines bestimmten Steuerelements im Element abzurufen, verwenden Sie die FindControl-Methode des Item-Ereignisargumentobjekts.

Die Werte, die Sie im SqlDataSource1.UpdateParameters-Wörterbuch festlegen, müssen zu den Namen passen, die im UpdateParameters-Element festgelegt werden.

Kompilieren des Codes

Für den Code ist eine Verbindungszeichenfolge mit Namen NorthwindConnectionString erforderlich. Die Datenbank, zu der Sie die Verbindung herstellen, muss eine Tabelle mit dem Namen Categories und den Feldern CategoryID, CategoryName und Description enthalten.

Das Konto, unter dem die Verbindung zwischen der Seite und der Datenbank hergestellt wird, muss berechtigt sein, diese Kategorientabelle zu aktualisieren.

Robuste Programmierung

Im Codebeispiel sind folgende Aufgaben nicht berücksichtigt, die normalerweise in einer Produktionsumgebung durchgeführt würden:

  • Es fehlt eine Fehlerprüfung, ob die FindControl-Methode ein gültiges Steuerelement zurückgibt. Vergewissern Sie sich bei robusterem Code, dass der von der FindControl-Methode zurückgegebene Wert keine Nullreferenz (Nothing in Visual Basic) ist.

  • Der Code überprüft nicht, ob die Aktualisierung erfolgreich war.

Sicherheit

Benutzereingaben in eine Web Forms-Seite können schädliche Clientskripts enthalten. Standardmäßig wird durch die Web Forms-Seite sichergestellt, dass Benutzereingaben keine Skript- oder HTML-Elemente enthalten. Weitere Informationen finden Sie unter Übersicht über Skriptangriffe.

Siehe auch

Konzepte

Bearbeiten von Daten mithilfe des SqlDataSource-Steuerelements

Verwenden von Parametern mit dem SqlDataSource-Steuerelement

Referenz

Übersicht über das DataList-Webserversteuerelement