Freigeben über


Übersicht über das Einfügen, Aktualisieren und Löschen von Daten (VB)

von Scott Mitchell

PDF herunterladen

In diesem Tutorial erfahren Sie, wie Sie die Insert(), Update() und Delete()-Methoden einer ObjectDataSource den Methoden von BLL-Klassen zuordnen und wie Sie die GridView-, DetailsView- und FormView-Steuerelemente konfigurieren, um Datenänderungsfunktionen bereitzustellen.

Einführung

In den letzten Tutorials haben wir untersucht, wie Daten mithilfe der Steuerelemente GridView, DetailsView und FormView auf einer ASP.NET Seite angezeigt werden. Diese Steuerelemente arbeiten einfach mit den ihnen bereitgestellten Daten. In der Regel steuern diese den Zugriff auf Daten mithilfe eines Datenquellensteuerelements, z. B. objectDataSource. Wir haben gesehen, wie ObjectDataSource als Proxy zwischen der ASP.NET Seite und den zugrunde liegenden Daten fungiert. Wenn ein GridView Daten anzeigen muss, ruft es die ObjectDataSource-Methode auf Select() , die wiederum eine Methode aus unserer Business Logic Layer (BLL) aufruft, die eine Methode im entsprechenden Data Access Layer (DAL) TableAdapter aufruft, der wiederum eine SELECT Abfrage an die Northwind-Datenbank sendet.

Denken Sie daran, dass Visual Studio beim Erstellen der TableAdapters in der DAL in unserem ersten Tutorial automatisch Methoden zum Einfügen, Aktualisieren und Löschen von Daten aus der zugrunde liegenden Datenbanktabelle hinzugefügt hat. Darüber hinaus haben wir in Erstellen einer Geschäftslogikebene Methoden in der BLL entworfen, die diese DAL-Methoden zur Datenänderung aufgerufen haben.

Zusätzlich zur Select() -Methode verfügt objectDataSource auch über Insert()die Methoden , Update()und Delete() . Wie die Select() -Methode können diese drei Methoden methoden in einem zugrunde liegenden Objekt zugeordnet werden. Wenn sie zum Einfügen, Aktualisieren oder Löschen von Daten konfiguriert sind, stellen die Steuerelemente GridView, DetailsView und FormView eine Benutzeroberfläche zum Ändern der zugrunde liegenden Daten bereit. Diese Benutzeroberfläche ruft die Insert()Methoden , Update()und Delete() der ObjectDataSource auf, die dann die dem zugrunde liegenden Objekt zugeordneten Methoden aufrufen (siehe Abbildung 1).

Die ObjectDataSource-Methoden Insert(), Update() und Delete() dienen als Proxy in die BLL.

Abbildung 1: Die ObjectDataSource-Methoden Insert(), Update()und Delete() dienen als Proxy für die BLL (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

In diesem Tutorial erfahren Sie, wie Sie die ObjectDataSource-Methoden Insert(), Update()und Delete() Methoden von Klassen in der BLL zuordnen und wie Sie die GridView-, DetailsView- und FormView-Steuerelemente konfigurieren, um Datenänderungsfunktionen bereitzustellen.

Schritt 1: Erstellen der Tutorials-Webseiten zum Einfügen, Aktualisieren und Löschen

Bevor wir uns mit dem Einfügen, Aktualisieren und Löschen von Daten beginnen, nehmen wir uns zunächst einen Moment Zeit, um die ASP.NET Seiten in unserem Websiteprojekt zu erstellen, die wir für dieses Und die nächsten Lernprogramm benötigen. Fügen Sie zunächst einen neuen Ordner mit dem Namen hinzu EditInsertDelete. Fügen Sie als Nächstes die folgenden ASP.NET Seiten zu diesem Ordner hinzu, und stellen Sie sicher, dass Sie jede Seite der Site.master master Seite zuordnen:

  • Default.aspx
  • Basics.aspx
  • DataModificationEvents.aspx
  • ErrorHandling.aspx
  • UIValidation.aspx
  • CustomizedUI.aspx
  • OptimisticConcurrency.aspx
  • ConfirmationOnDelete.aspx
  • UserLevelAccess.aspx

Hinzufügen der ASP.NET-Seiten für die Tutorials zu Daten Modification-Related

Abbildung 2: Hinzufügen der ASP.NET-Seiten für die Data Modification-Related Tutorials

Wie in den anderen Ordnern Default.aspx listet der EditInsertDelete Ordner die Tutorials in seinem Abschnitt auf. Denken Sie daran, dass das SectionLevelTutorialListing.ascx Benutzersteuerelement diese Funktionalität bereitstellt. Fügen Sie daher dieses Benutzersteuerelement zu Default.aspx hinzu, indem Sie es vom Projektmappen-Explorer in die Entwurfsansicht der Seite ziehen.

Hinzufügen des SectionLevelTutorialListing.ascx-Benutzersteuerelements zu Default.aspx

Abbildung 3: Hinzufügen des SectionLevelTutorialListing.ascx Benutzersteuerelements zu (Klicken Sie hier, umDefault.aspx das Bild in voller Größe anzuzeigen)

Fügen Sie schließlich die Seiten als Einträge zur Web.sitemap Datei hinzu. Fügen Sie insbesondere das folgende Markup nach der angepassten Formatierung <siteMapNode>hinzu:

<siteMapNode title="Editing, Inserting, and Deleting" url="~/EditInsertDelete/Default.aspx" description="Samples of Reports that Provide Editing, Inserting, and Deleting Capabilities"> <siteMapNode url="~/EditInsertDelete/Basics.aspx" title="Basics" description="Examines the basics of data modification with the GridView, DetailsView, and FormView controls." /> <siteMapNode url="~/EditInsertDelete/DataModificationEvents.aspx" title="Data Modification Events" description="Explores the events raised by the ObjectDataSource pertinent to data modification." /> <siteMapNode url="~/EditInsertDelete/ErrorHandling.aspx" title="Error Handling" description="Learn how to gracefully handle exceptions raised during the data modification workflow." /> <siteMapNode url="~/EditInsertDelete/UIValidation.aspx" title="Adding Data Entry Validation" description="Help prevent data entry errors by providing validation." /> <siteMapNode url="~/EditInsertDelete/CustomizedUI.aspx" title="Customize the User Interface" description="Customize the editing and inserting user interfaces." /> <siteMapNode url="~/EditInsertDelete/OptimisticConcurrency.aspx" title="Optimistic Concurrency" description="Learn how to help prevent simultaneous users from overwritting one another s changes." /> <siteMapNode url="~/EditInsertDelete/ConfirmationOnDelete.aspx" title="Confirm On Delete" description="Prompt a user for confirmation when deleting a record." /> <siteMapNode url="~/EditInsertDelete/UserLevelAccess.aspx" title="Limit Capabilities Based on User" description="Learn how to limit the data modification functionality based on the user role or permissions." /> </siteMapNode>

Nehmen Sie sich nach dem Aktualisieren Web.sitemapeinen Moment Zeit, um die Tutorials-Website über einen Browser anzuzeigen. Das Menü auf der linken Seite enthält nun Elemente zum Bearbeiten, Einfügen und Löschen von Tutorials.

Die Websiteübersicht enthält jetzt Einträge für die Tutorials zum Bearbeiten, Einfügen und Löschen.

Abbildung 4: Die Websiteübersicht enthält jetzt Einträge für die Tutorials zum Bearbeiten, Einfügen und Löschen.

Schritt 2: Hinzufügen und Konfigurieren des ObjectDataSource-Steuerelements

Da sich GridView, DetailsView und FormView jeweils in ihren Datenänderungsfunktionen und dem Layout unterscheiden, sehen wir uns diese einzeln an. Anstatt jedoch für jedes Steuerelement eine eigene ObjectDataSource zu verwenden, erstellen wir einfach eine einzelne ObjectDataSource, die von allen drei Steuerelementbeispielen gemeinsam verwendet werden kann.

Öffnen Sie die Basics.aspx Seite, ziehen Sie eine ObjectDataSource aus der Toolbox auf die Designer, und klicken Sie im Smarttag auf den Link Datenquelle konfigurieren. Da die ProductsBLL einzige BLL-Klasse ist, die Bearbeitungs-, Einfüge- und Löschmethoden bereitstellt, konfigurieren Sie objectDataSource für die Verwendung dieser Klasse.

Konfigurieren der ObjectDataSource für die Verwendung der ProductsBLL-Klasse

Abbildung 5: Konfigurieren der ObjectDataSource für die Verwendung der ProductsBLL -Klasse (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Auf dem nächsten Bildschirm können wir angeben, welche Methoden der ProductsBLL -Klasse , , Update()und Delete() der ObjectDataSource Select()Insert()zugeordnet sind, indem sie die entsprechende Registerkarte auswählen und die -Methode aus der Dropdownliste auswählen. Abbildung 6, die inzwischen vertraut aussehen sollte, ordnet die ObjectDataSource-Methode Select() der -Methode der ProductsBLL -Klasse GetProducts() zu. Die Insert()Methoden , Update()und Delete() können konfiguriert werden, indem Sie oben in der Liste die entsprechende Registerkarte auswählen.

Lassen Sie objectDataSource alle Produkte zurückgeben.

Abbildung 6: Die ObjectDataSource gibt alle Produkte zurück (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

In den Abbildungen 7, 8 und 9 sind die Registerkarten UPDATE, INSERT und DELETE der ObjectDataSource dargestellt. Konfigurieren Sie diese Registerkarten so, dass die Insert()Methoden , Update()und Delete() die Methoden , AddProductund DeleteProduct der ProductsBLL -Klasse UpdateProductjeweils aufrufen.

Zuordnen der Update()-Methode von ObjectDataSource zur UpdateProduct-Methode der ProductBLL-Klasse

Abbildung 7: Zuordnen der ObjectDataSource-Methode Update() zur Methode der ProductBLL Klasse UpdateProduct (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Zuordnen der Insert()-Methode der ObjectDataSource zur AddProduct-Methode der ProductBLL-Klasse

Abbildung 8: Zuordnen der ObjectDataSource-Methode Insert() zur Add-Methode Product der ProductBLL Klasse (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Zuordnen der Delete()-Methode von ObjectDataSource zur DeleteProduct-Methode der ProductBLL-Klasse

Abbildung 9: Zuordnen der ObjectDataSource-Methode Delete() zur -Methode der ProductBLL Klasse DeleteProduct (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Möglicherweise haben Sie bemerkt, dass in den Dropdownlisten auf den Registerkarten UPDATE, INSERT und DELETE diese Methoden bereits ausgewählt waren. Dies ist dank unserer Verwendung der, die DataObjectMethodAttribute die Methoden von ProductsBLLschmückt. Die DeleteProduct-Methode weist beispielsweise die folgende Signatur auf:

<System.ComponentModel.DataObjectMethodAttribute _ (System.ComponentModel.DataObjectMethodType.Delete, True)> _ Public Function DeleteProduct(ByVal productID As Integer) As Boolean End Function

Das DataObjectMethodAttribute Attribut gibt den Zweck jeder Methode an, unabhängig davon, ob es sich um das Auswählen, Einfügen, Aktualisieren oder Löschen handelt und ob es sich um den Standardwert handelt. Wenn Sie diese Attribute beim Erstellen Ihrer BLL-Klassen weggelassen haben, müssen Sie die Methoden auf den Registerkarten UPDATE, INSERT und DELETE manuell auswählen.

Nachdem Sie sichergestellt haben, dass die entsprechenden ProductsBLL Methoden den Methoden , Update()und Delete() von ObjectDataSource Insert()zugeordnet sind, klicken Sie auf Fertig stellen, um den Assistenten abzuschließen.

Untersuchen des Markups von ObjectDataSource

Nachdem Sie objectDataSource über den Assistenten konfiguriert haben, wechseln Sie zur Ansicht Quelle, um das generierte deklarative Markup zu untersuchen. Das <asp:ObjectDataSource> Tag gibt das zugrunde liegende Objekt und die methoden an, die aufgerufen werden sollen. Darüber hinaus gibt es , UpdateParametersund , die den Eingabeparametern für die Methoden , UpdateProductund DeleteProduct der ProductsBLL Klasse AddProductzugeordnet sindDeleteParametersInsertParameters:

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" DeleteMethod="DeleteProduct" InsertMethod="AddProduct" OldValuesParameterFormatString="original_{0}" SelectMethod="GetProducts" TypeName="ProductsBLL" UpdateMethod="UpdateProduct"> <DeleteParameters> <asp:Parameter Name="productID" Type="Int32" /> </DeleteParameters> <UpdateParameters> <asp:Parameter Name="productName" Type="String" /> <asp:Parameter Name="supplierID" Type="Int32" /> <asp:Parameter Name="categoryID" Type="Int32" /> <asp:Parameter Name="quantityPerUnit" Type="String" /> <asp:Parameter Name="unitPrice" Type="Decimal" /> <asp:Parameter Name="unitsInStock" Type="Int16" /> <asp:Parameter Name="unitsOnOrder" Type="Int16" /> <asp:Parameter Name="reorderLevel" Type="Int16" /> <asp:Parameter Name="discontinued" Type="Boolean" /> <asp:Parameter Name="productID" Type="Int32" /> </UpdateParameters> <InsertParameters> <asp:Parameter Name="productName" Type="String" /> <asp:Parameter Name="supplierID" Type="Int32" /> <asp:Parameter Name="categoryID" Type="Int32" /> <asp:Parameter Name="quantityPerUnit" Type="String" /> <asp:Parameter Name="unitPrice" Type="Decimal" /> <asp:Parameter Name="unitsInStock" Type="Int16" /> <asp:Parameter Name="unitsOnOrder" Type="Int16" /> <asp:Parameter Name="reorderLevel" Type="Int16" /> <asp:Parameter Name="discontinued" Type="Boolean" /> </InsertParameters> </asp:ObjectDataSource>

ObjectDataSource enthält einen Parameter für jeden Eingabeparameter für die zugeordneten Methoden, genau wie eine Liste von SelectParameter s vorhanden ist, wenn ObjectDataSource so konfiguriert ist, dass eine select-Methode aufgerufen wird, die einen Eingabeparameter erwartet (z GetProductsByCategoryID(categoryID). B. ). Wie wir in Kürze sehen werden, werden Werte für diese DeleteParameters, UpdateParametersund InsertParameters automatisch von GridView, DetailsView und FormView festgelegt, bevor die ObjectDataSource-Methode Insert(), Update()oder Delete() aufgerufen wird. Diese Werte können bei Bedarf auch programmgesteuert festgelegt werden, wie in einem zukünftigen Tutorial erläutert wird.

Eine Nebenwirkung der Verwendung des Assistenten zum Konfigurieren von ObjectDataSource besteht darin, dass Visual Studio die OldValuesParameterFormatString-Eigenschaft auf original_{0}festlegt. Dieser Eigenschaftswert wird verwendet, um die ursprünglichen Werte der zu bearbeitenden Daten einzuschließen und ist in zwei Szenarien nützlich:

  • Wenn Benutzer beim Bearbeiten eines Datensatzes den Primärschlüsselwert ändern können. In diesem Fall müssen sowohl der neue Primärschlüsselwert als auch der ursprüngliche Primärschlüsselwert angegeben werden, damit der Datensatz mit dem ursprünglichen Primärschlüsselwert gefunden und sein Wert entsprechend aktualisiert wird.
  • Bei Verwendung von optimistischer Parallelität. Die optimistische Parallelität ist eine Technik, mit der sichergestellt wird, dass sich zwei gleichzeitige Benutzer nicht gegenseitig die Änderungen überschreiben, und ist das Thema für ein zukünftiges Tutorial.

Die OldValuesParameterFormatString -Eigenschaft gibt den Namen der Eingabeparameter in den Update- und Löschmethoden des zugrunde liegenden Objekts für die ursprünglichen Werte an. Wir werden diese Eigenschaft und ihren Zweck ausführlicher besprechen, wenn wir die optimistische Parallelität untersuchen. Ich erwarte es jedoch jetzt, da die Methoden unserer BLL nicht die ursprünglichen Werte erwarten und daher ist es wichtig, dass wir diese Eigenschaft entfernen. Wenn die OldValuesParameterFormatString Eigenschaft auf einen anderen Wert als den Standardwert ({0}) festgelegt wird, wird ein Fehler verursacht, wenn ein Datenwebsteuerelement versucht, die ObjectDataSource- Update() oder -Methoden aufzurufenDelete(), da objectDataSource versucht, sowohl die angegebenen oder DeleteParameters als auch die UpdateParameters ursprünglichen Wertparameter zu übergeben.

Wenn dies zu diesem Zeitpunkt nicht besonders klar ist, machen Sie sich keine Sorgen, wir werden diese Eigenschaft und ihren Nutzen in einem zukünftigen Tutorial untersuchen. Stellen Sie zunächst sicher, dass Sie diese Eigenschaftsdeklaration entweder vollständig aus der deklarativen Syntax entfernen oder den Wert auf den Standardwert ({0}) festlegen.

Hinweis

Wenn Sie einfach den OldValuesParameterFormatString Eigenschaftswert aus dem Eigenschaftenfenster in der Entwurfsansicht löschen, ist die Eigenschaft weiterhin in der deklarativen Syntax vorhanden, aber auf eine leere Zeichenfolge festgelegt. Dies führt leider immer noch zu dem oben beschriebenen Problem. Entfernen Sie daher entweder die Eigenschaft vollständig aus der deklarativen Syntax, oder legen Sie aus der Eigenschaftenfenster den Wert auf den Standardwert fest. {0}

Schritt 3: Hinzufügen eines Datenwebsteuerelements und Konfigurieren des Steuerelements für Datenänderungen

Nachdem die ObjectDataSource der Seite hinzugefügt und konfiguriert wurde, können wir der Seite Datenwebsteuerelemente hinzufügen, um die Daten anzuzeigen und dem Endbenutzer eine Möglichkeit zum Ändern bereitzustellen. Wir sehen uns GridView, DetailsView und FormView separat an, da sich diese Datenwebsteuerelemente in ihren Datenänderungsfunktionen und ihrer Konfiguration unterscheiden.

Wie wir im weiteren Verlauf dieses Artikels sehen werden, ist das Hinzufügen von sehr einfachen Bearbeitungs-, Einfüge- und Löschunterstützungen über die Steuerelemente GridView, DetailsView und FormView wirklich so einfach wie das Aktivieren einiger Kontrollkästchen. Es gibt viele Feinheiten und Edgefälle in der Praxis, die die Bereitstellung solcher Funktionen wichtiger machen als nur Point-and-Click. Dieses Tutorial konzentriert sich jedoch ausschließlich auf den Nachweis einfacher Datenänderungsfunktionen. Zukünftige Tutorials werden Bedenken untersuchen, die zweifellos in einer realen Umgebung auftreten werden.

Löschen von Daten aus GridView

Ziehen Sie zunächst ein GridView-Objekt aus der Toolbox auf die Designer. Binden Sie als Nächstes die ObjectDataSource an gridView, indem Sie es in der Dropdownliste im Smarttag von GridView auswählen. An diesem Punkt ist das deklarative Markup von GridView wie folgt:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="ProductID" DataSourceID="ObjectDataSource1"> <Columns> <asp:BoundField DataField="ProductID" HeaderText="ProductID" InsertVisible="False" ReadOnly="True" SortExpression="ProductID" /> <asp:BoundField DataField="ProductName" HeaderText="ProductName" SortExpression="ProductName" /> <asp:BoundField DataField="SupplierID" HeaderText="SupplierID" SortExpression="SupplierID" /> <asp:BoundField DataField="CategoryID" HeaderText="CategoryID" SortExpression="CategoryID" /> <asp:BoundField DataField="QuantityPerUnit" HeaderText="QuantityPerUnit" SortExpression="QuantityPerUnit" /> <asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice" SortExpression="UnitPrice" /> <asp:BoundField DataField="UnitsInStock" HeaderText="UnitsInStock" SortExpression="UnitsInStock" /> <asp:BoundField DataField="UnitsOnOrder" HeaderText="UnitsOnOrder" SortExpression="UnitsOnOrder" /> <asp:BoundField DataField="ReorderLevel" HeaderText="ReorderLevel" SortExpression="ReorderLevel" /> <asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued" SortExpression="Discontinued" /> <asp:BoundField DataField="CategoryName" HeaderText="CategoryName" ReadOnly="True" SortExpression="CategoryName" /> <asp:BoundField DataField="SupplierName" HeaderText="SupplierName" ReadOnly="True" SortExpression="SupplierName" /> </Columns> </asp:GridView>

Das Binden von GridView an objectDataSource über das zugehörige Smarttag hat zwei Vorteile:

  • BoundFields und CheckBoxFields werden automatisch für die von ObjectDataSource zurückgegebenen Felder erstellt. Darüber hinaus werden die Eigenschaften BoundField und CheckBoxField basierend auf den Metadaten des zugrunde liegenden Felds festgelegt. Beispielsweise sind die ProductIDFelder , CategoryNameund SupplierName in der ProductsDataTable als schreibgeschützt gekennzeichnet und sollten daher beim Bearbeiten nicht aktualisierbar sein. Um dies zu berücksichtigen, sind die ReadOnly-Eigenschaften dieser BoundFields auf Truefestgelegt.
  • Die DataKeyNames-Eigenschaft wird den Primärschlüsselfeldern des zugrunde liegenden Objekts zugewiesen. Dies ist wichtig, wenn Sie gridView zum Bearbeiten oder Löschen von Daten verwenden, da diese Eigenschaft das Feld (oder die Gruppe von Feldern) angibt, das jeden Datensatz eindeutig identifiziert. Weitere Informationen zur DataKeyNames -Eigenschaft finden Sie im Tutorial Master/Detail Using a Selectable Master GridView with a Details DetailView .

Die GridView kann zwar über die Eigenschaftenfenster- oder deklarative Syntax an die ObjectDataSource gebunden werden, dafür müssen Sie jedoch manuell das entsprechende BoundField- und DataKeyNames Markup hinzufügen.

Das GridView-Steuerelement bietet integrierte Unterstützung für das Bearbeiten und Löschen auf Zeilenebene. Wenn Sie eine GridView-Instanz konfigurieren, um das Löschen zu unterstützen, wird eine Spalte mit Schaltflächen zum Löschen hinzugefügt. Wenn der Endbenutzer für eine bestimmte Zeile auf die Schaltfläche Löschen klickt, wird ein Postback ausgeführt, und gridView führt die folgenden Schritte aus:

  1. Die Werte der DeleteParameters ObjectDataSource werden zugewiesen.
  2. Die ObjectDataSource-Methode Delete() wird aufgerufen, und der angegebene Datensatz wird gelöscht.
  3. GridView rebiniert sich an die ObjectDataSource, indem die - Select() Methode aufgerufen wird.

Die dem DeleteParameters zugewiesenen Werte sind die Werte der DataKeyNames Felder für die Zeile, auf deren Schaltfläche Löschen geklickt wurde. Daher ist es wichtig, dass die Eigenschaft einer GridView DataKeyNames richtig festgelegt wird. Wenn es fehlt, wird dem DeleteParameters der Wert in Nothing Schritt 1 zugewiesen, was wiederum zu keinen gelöschten Datensätzen in Schritt 2 führt.

Hinweis

Die DataKeys Auflistung wird im GridView-Steuerelementzustand gespeichert, was bedeutet, dass die Werte über das DataKeys Postback gespeichert werden, auch wenn der Ansichtszustand der GridView deaktiviert wurde. Es ist jedoch sehr wichtig, dass der Ansichtsstatus für GridViews aktiviert bleibt, die das Bearbeiten oder Löschen unterstützen (das Standardverhalten). Wenn Sie die GridView-Eigenschaft auf falsefestlegen, funktioniert das BearbeitungsEnableViewState- und Löschverhalten für einen einzelnen Benutzer gut, aber wenn gleichzeitige Benutzer Daten löschen, besteht die Möglichkeit, dass diese gleichzeitigen Benutzer versehentlich Datensätze löschen oder bearbeiten, die sie nicht beabsichtigt haben.

Diese Warnung gilt auch für DetailsViews und FormViews.

Um einer GridView Löschfunktionen hinzuzufügen, wechseln Sie einfach zu dessen Smarttag, und aktivieren Sie das Kontrollkästchen Löschen aktivieren.

Aktivieren Sie das Kontrollkästchen Löschen aktivieren.

Abbildung 10: Aktivieren des Kontrollkästchens Löschen aktivieren

Wenn Sie das Kontrollkästchen Löschen aktivieren über das Smarttag aktivieren, wird der GridView ein CommandField hinzugefügt. CommandField rendert eine Spalte in gridView mit Schaltflächen zum Ausführen einer oder mehrerer der folgenden Aufgaben: Auswählen eines Datensatzes, Bearbeiten eines Datensatzes und Löschen eines Datensatzes. Zuvor haben wir das CommandField in Aktion mit der Auswahl von Datensätzen im Tutorial Master/Detail Using a Selectable Master GridView with a Details DetailView gesehen.

CommandField enthält eine Reihe von ShowXButton Eigenschaften, die angeben, welche Reihe von Schaltflächen im CommandField angezeigt werden. Aktivieren Sie das Kontrollkästchen Löschen aktivieren ein CommandField, dessen ShowDeleteButton Eigenschaft der Columns-Auflistung von GridView hinzugefügt wurde True .

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="ProductID" DataSourceID="ObjectDataSource1"> <Columns> <asp:CommandField ShowDeleteButton="True" /> ... BoundFields removed for brevity ... </Columns> </asp:GridView>

An diesem Punkt, ob Sie es glauben oder nicht, sind wir fertig mit dem Hinzufügen von Löschunterstützung zu GridView! Wie Abbildung 11 zeigt, ist beim Aufrufen dieser Seite über einen Browser eine Spalte mit Schaltflächen zum Löschen vorhanden.

CommandField fügt eine Spalte mit Schaltflächen zum Löschen hinzu

Abbildung 11: CommandField fügt eine Spalte mit Schaltflächen zum Löschen hinzu (Klicken Sie hier, um das bild in voller Größe anzuzeigen)

Wenn Sie dieses Tutorial von Grund auf selbst erstellt haben, wird beim Testen dieser Seite durch Klicken auf die Schaltfläche Löschen eine Ausnahme ausgelöst. Lesen Sie weiter, um zu erfahren, warum diese Ausnahmen ausgelöst wurden und wie Sie sie beheben können.

Hinweis

Wenn Sie den In diesem Tutorial beigefügten Download verwenden, wurden diese Probleme bereits berücksichtigt. Ich ermutige Sie jedoch, die unten aufgeführten Details zu lesen, um probleme zu identifizieren, die auftreten können, und geeignete Problemumgehungen.

Wenn Sie beim Versuch, ein Produkt zu löschen, eine Ausnahme erhalten, deren Meldung "ObjectDataSource 'ObjectDataSource1' keine nicht generische Methode 'DeleteProduct' finden konnte, die Parameter enthält: productID, original_ProductID", haben Sie wahrscheinlich vergessen, die OldValuesParameterFormatString Eigenschaft aus der ObjectDataSource zu entfernen. Wenn die OldValuesParameterFormatString -Eigenschaft angegeben ist, versucht objectDataSource, sowohl Eingabeparameter als auch productIDoriginal_ProductID an die DeleteProduct -Methode zu übergeben. DeleteProductakzeptiert jedoch nur einen einzelnen Eingabeparameter, daher die Ausnahme. Durch Entfernen der OldValuesParameterFormatString -Eigenschaft (oder Festlegen auf {0}) wird objectDataSource angewiesen, nicht zu versuchen, den ursprünglichen Eingabeparameter zu übergeben.

Stellen Sie sicher, dass die OldValuesParameterFormatString-Eigenschaft gelöscht wurde.

Abbildung 12: Stellen Sie sicher, dass die OldValuesParameterFormatString Eigenschaft gelöscht wurde (Klicken Sie hier, um das bild in voller Größe anzuzeigen)

Selbst wenn Sie die OldValuesParameterFormatString Eigenschaft entfernt haben, erhalten Sie immer noch eine Ausnahme, wenn Sie versuchen, ein Produkt mit der Meldung zu löschen: "Die DELETE-Anweisung stand im Konflikt mit der REFERENCE-Einschränkung 'FK_Order_Details_Products'." Die Northwind-Datenbank enthält eine Fremdschlüsseleinschränkung zwischen der Order Details Tabelle und Products , was bedeutet, dass ein Produkt nicht aus dem System gelöscht werden kann, wenn es einen oder mehrere Datensätze in der Order Details Tabelle gibt. Da jedes Produkt in der Northwind-Datenbank mindestens einen Datensatz enthält Order Details, können wir keine Produkte löschen, bis wir zuerst die zugehörigen Auftragsdetails des Produkts löschen.

Eine Fremdschlüsseleinschränkung verhindert das Löschen von Produkten

Abbildung 13: Eine Fremdschlüsseleinschränkung verhindert das Löschen von Produkten (Klicken Sie hier, um das bild in voller Größe anzuzeigen)

In unserem Tutorial löschen wir einfach alle Datensätze aus der Order Details Tabelle. In einer realen Anwendung müssen Sie folgendes ausführen:

  • Verwenden eines anderen Bildschirms zum Verwalten von Bestelldetails
  • Erweitern der DeleteProduct Methode, um Logik zum Löschen der Bestelldetails des angegebenen Produkts einzuschließen
  • Ändern Sie die vom TableAdapter verwendete SQL-Abfrage so, dass sie das Löschen der Bestelldetails des angegebenen Produkts enthält.

Löschen Sie einfach alle Datensätze aus der Tabelle, um die Order Details Fremdschlüsseleinschränkung zu umgehen. Navigieren Sie zum Explorer Server in Visual Studio, klicken Sie mit der rechten Maustaste auf den NORTHWND.MDF Knoten, und wählen Sie Neue Abfrage aus. Führen Sie dann im Abfragefenster die folgende SQL-Anweisung aus: DELETE FROM [Order Details]

Löschen aller Datensätze aus der Tabelle

Abbildung 14: Löschen aller Datensätze aus der Order Details Tabelle (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Nachdem Sie die Order Details Tabelle gelöscht haben, wird das Produkt durch Klicken auf die Schaltfläche Löschen ohne Fehler gelöscht. Wenn das Produkt durch Klicken auf die Schaltfläche Löschen nicht gelöscht wird, überprüfen Sie, ob die GridView-Eigenschaft DataKeyNames auf das Primärschlüsselfeld (ProductID) festgelegt ist.

Hinweis

Wenn Sie auf die Schaltfläche Löschen klicken, erfolgt ein Postback, und der Datensatz wird gelöscht. Dies kann gefährlich sein, da es einfach ist, versehentlich auf die Schaltfläche Löschen in der falschen Zeile zu klicken. In einem zukünftigen Tutorial erfahren Sie, wie Sie beim Löschen eines Datensatzes eine clientseitige Bestätigung hinzufügen.

Bearbeiten von Daten mit gridView

Neben dem Löschen bietet das GridView-Steuerelement auch integrierte Bearbeitungsunterstützung auf Zeilenebene. Wenn Sie eine GridView für die Unterstützung der Bearbeitung konfigurieren, wird eine Spalte mit Schaltflächen bearbeiten hinzugefügt. Aus Sicht des Endbenutzers führt das Klicken auf die Schaltfläche Bearbeiten einer Zeile dazu, dass diese Zeile bearbeitbar wird, indem die Zellen in Textfelder umgewandelt werden, die die vorhandenen Werte enthalten, und die Schaltfläche Bearbeiten durch die Schaltflächen Aktualisieren und Abbrechen ersetzt wird. Nachdem der Endbenutzer die gewünschten Änderungen vorgenommen hat, kann er auf die Schaltfläche Aktualisieren klicken, um die Änderungen zu committen, oder auf die Schaltfläche Abbrechen, um sie zu verwerfen. In beiden Fällen kehrt gridView nach dem Klicken auf Aktualisieren oder Abbrechen in den Zustand vor der Bearbeitung zurück.

Wenn der Endbenutzer aus unserer Sicht als Seitenentwickler auf die Schaltfläche Bearbeiten für eine bestimmte Zeile klickt, erfolgt ein Postback, und GridView führt die folgenden Schritte aus:

  1. Die GridView-Eigenschaft EditItemIndex ist dem Index der Zeile zugewiesen, auf deren Schaltfläche Bearbeiten geklickt wurde.
  2. GridView rebiniert sich an die ObjectDataSource, indem die - Select() Methode aufgerufen wird.
  3. Der Zeilenindex, der dem EditItemIndex entspricht, wird im "Bearbeitungsmodus" gerendert. In diesem Modus wird die Schaltfläche Bearbeiten durch die Schaltflächen Aktualisieren und Abbrechen ersetzt, und BoundFields, deren ReadOnly Eigenschaften False (Standard) sind, werden als TextBox-Websteuerelemente gerendert, deren Text Eigenschaften den Werten der Datenfelder zugewiesen sind.

An diesem Punkt wird das Markup an den Browser zurückgegeben, sodass der Endbenutzer änderungen an den Zeilendaten vornehmen kann. Wenn der Benutzer auf die Schaltfläche Aktualisieren klickt, erfolgt ein Postback, und GridView führt die folgenden Schritte aus:

  1. Den Wert(n) der UpdateParameters ObjectDataSource werden die vom Endbenutzer in die Bearbeitungsoberfläche von GridView eingegebenen Werte zugewiesen.
  2. Die ObjectDataSource-Methode Update() wird aufgerufen, wobei der angegebene Datensatz aktualisiert wird.
  3. GridView rebiniert sich an die ObjectDataSource, indem die - Select() Methode aufgerufen wird.

Die in Schritt 1 zugewiesenen UpdateParameters Primärschlüsselwerte stammen aus den in der DataKeyNames -Eigenschaft angegebenen Werten, während die Nicht-Primärschlüsselwerte aus dem Text in den TextBox-Websteuerelementen für die bearbeitete Zeile stammen. Wie beim Löschen ist es wichtig, dass die Eigenschaft einer GridView DataKeyNames ordnungsgemäß festgelegt wird. Wenn er fehlt, wird dem UpdateParameters Primärschlüsselwert der Wert Nothing in Schritt 1 zugewiesen, was wiederum keine aktualisierten Datensätze in Schritt 2 zur Folge hat.

Die Bearbeitungsfunktion kann aktiviert werden, indem Sie einfach das Kontrollkästchen Bearbeitung aktivieren im Smarttag von GridView aktivieren.

Aktivieren Sie das Kontrollkästchen Bearbeitung aktivieren.

Abbildung 15: Aktivieren des Kontrollkästchens Bearbeitung aktivieren

Wenn Sie das Kontrollkästchen Bearbeitung aktivieren aktivieren, wird ein CommandField hinzugefügt (falls erforderlich) und die ShowEditButton -Eigenschaft auf Truefestgelegt. Wie wir bereits gesehen haben, enthält das CommandField eine Reihe von ShowXButton Eigenschaften, die angeben, welche Reihe von Schaltflächen im CommandField angezeigt werden. Wenn Sie das Kontrollkästchen Bearbeitung aktivieren aktivieren aktivieren, wird die ShowEditButton -Eigenschaft dem vorhandenen CommandField hinzugefügt:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="ProductID" DataSourceID="ObjectDataSource1"> <Columns> <asp:CommandField ShowDeleteButton="True" ShowEditButton="True" /> ... BoundFields removed for brevity ... </Columns> </asp:GridView>

Das ist alles, was es gibt, um rudimentäre Bearbeitungsunterstützung hinzuzufügen. Wie Abbildung 16 zeigt, ist die Bearbeitungsschnittstelle ziemlich grob jede BoundField-Eigenschaft, deren ReadOnly Eigenschaft auf False (standard) festgelegt ist, wird als TextBox gerendert. Dies schließt Felder wie CategoryID und SupplierIDein, die Schlüssel für andere Tabellen sind.

Wenn Sie auf die Schaltfläche

Abbildung 16: Klicken auf die Schaltfläche "Chai s Bearbeiten" zeigt die Zeile im Bearbeitungsmodus an (Klicken, um das bild in voller Größe anzuzeigen)

Neben der Aufforderung, Fremdschlüsselwerte direkt zu bearbeiten, fehlt die Benutzeroberfläche der Bearbeitungsschnittstelle auf folgende Weise:

  • Wenn der Benutzer ein CategoryID oder SupplierID ein oder eingibt, das nicht in der Datenbank vorhanden ist, verstößt die UPDATE gegen eine Fremdschlüsseleinschränkung, wodurch eine Ausnahme ausgelöst wird.
  • Die Bearbeitungsschnittstelle enthält keine Überprüfung. Wenn Sie keinen erforderlichen Wert (z ProductName. B. ) angeben oder einen Zeichenfolgenwert eingeben, für den ein numerischer Wert erwartet wird (z. B. die Eingabe von "Zu viel!" in das UnitPrice Textfeld), wird eine Ausnahme ausgelöst. In einem zukünftigen Tutorial wird das Hinzufügen von Validierungssteuerelementen zur Bearbeitungs-Benutzeroberfläche untersucht.
  • Derzeit müssen alle Produktfelder, die nicht schreibgeschützt sind, in der GridView enthalten sein. Wenn wir ein Feld aus der GridView entfernen würden, z. B. UnitPrice, wenn die Daten aktualisiert werden, würde GridView den UnitPriceUpdateParameters Wert nicht festlegen, wodurch der Datenbankdatensatz UnitPrice in einen NULL Wert geändert würde. Wenn ein erforderliches Feld, z ProductName. B. , aus gridView entfernt wird, schlägt die Aktualisierung mit der oben erwähnten Ausnahme "Spalte 'ProductName' lässt keine NULL-Werte zu" fehl.
  • Die Formatierung der Bearbeitungsschnittstelle lässt viel zu wünschen übrig. Die UnitPrice wird mit vier Dezimalstellen angezeigt. Idealerweise enthalten die CategoryID Werte und SupplierID DropDownLists, die die Kategorien und Lieferanten im System auflisten.

Dies sind alles Mängel, mit denen wir vorerst leben müssen, aber in zukünftigen Tutorials behandelt werden.

Einfügen, Bearbeiten und Löschen von Daten mit der Detailansicht

Wie wir in früheren Tutorials gesehen haben, zeigt das DetailsView-Steuerelement jeweils einen Datensatz an und ermöglicht wie GridView das Bearbeiten und Löschen des aktuell angezeigten Datensatzes. Sowohl die Benutzeroberfläche des Endbenutzers mit dem Bearbeiten und Löschen von Elementen aus einer DetailsView als auch der Workflow von der ASP.NET Seite ist mit der von GridView identisch. Die DetailsView unterscheidet sich von GridView darin, dass sie auch integrierte Einfügungsunterstützung bietet.

Um die Datenänderungsfunktionen von GridView zu veranschaulichen, fügen Sie zunächst der Seite über der Basics.aspx vorhandenen GridView eine DetailsView hinzu, und binden Sie sie über das Smarttag von DetailsView an die vorhandene ObjectDataSource. Löschen Sie als Nächstes die Eigenschaften und Width von Height DetailsView, und aktivieren Sie die Option Paging aktivieren im Smarttag. Aktivieren Sie im Smarttag einfach die Kontrollkästchen Bearbeiten aktivieren, Einfügen aktivieren und Löschen aktivieren, um die Bearbeitungs-, Einfüge- und Löschen-Unterstützung zu aktivieren.

Screenshot des Fensters

Abbildung 17: Konfigurieren des DetailsView-Steuerelements zur Unterstützung von Bearbeitung, Einfügen und Löschen

Wie bei GridView fügt das Hinzufügen von Bearbeitungs-, Einfüge- oder Löschunterstützung ein CommandField zu DetailsView hinzu, wie die folgende deklarative Syntax zeigt:

<asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False" DataKeyNames="ProductID" DataSourceID="ObjectDataSource1" AllowPaging="True"> <Fields> <asp:BoundField DataField="ProductID" HeaderText="ProductID" InsertVisible="False" ReadOnly="True" SortExpression="ProductID" /> <asp:BoundField DataField="ProductName" HeaderText="ProductName" SortExpression="ProductName" /> <asp:BoundField DataField="SupplierID" HeaderText="SupplierID" SortExpression="SupplierID" /> <asp:BoundField DataField="CategoryID" HeaderText="CategoryID" SortExpression="CategoryID" /> <asp:BoundField DataField="QuantityPerUnit" HeaderText="QuantityPerUnit" SortExpression="QuantityPerUnit" /> <asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice" SortExpression="UnitPrice" /> <asp:BoundField DataField="UnitsInStock" HeaderText="UnitsInStock" SortExpression="UnitsInStock" /> <asp:BoundField DataField="UnitsOnOrder" HeaderText="UnitsOnOrder" SortExpression="UnitsOnOrder" /> <asp:BoundField DataField="ReorderLevel" HeaderText="ReorderLevel" SortExpression="ReorderLevel" /> <asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued" SortExpression="Discontinued" /> <asp:BoundField DataField="CategoryName" HeaderText="CategoryName" ReadOnly="True" SortExpression="CategoryName" /> <asp:BoundField DataField="SupplierName" HeaderText="SupplierName" ReadOnly="True" SortExpression="SupplierName" /> <asp:CommandField ShowDeleteButton="True" ShowEditButton="True" ShowInsertButton="True" /> </Fields> </asp:DetailsView>

Beachten Sie, dass für detailsView das CommandField standardmäßig am Ende der Columns-Auflistung angezeigt wird. Da die Felder von DetailsView als Zeilen gerendert werden, wird commandField als Zeile mit den Schaltflächen Einfügen, Bearbeiten und Löschen am unteren Rand von DetailsView angezeigt.

Screenshot der DetailsView mit dem CommandField als untere Zeile mit den Schaltflächen Einfügen, Bearbeiten und Löschen.

Abbildung 18: Konfigurieren von DetailsView für die Unterstützung von Bearbeitung, Einfügen und Löschen (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Wenn Sie auf die Schaltfläche Löschen klicken, wird dieselbe Abfolge von Ereignissen wie bei GridView gestartet: ein Postback; gefolgt von DetailsView, das seine ObjectDataSource-Dateien DeleteParameters basierend auf den DataKeyNames Werten auffüllt, und wird mit einem Aufruf der ObjectDataSource-Methode Delete() abgeschlossen, die das Produkt tatsächlich aus der Datenbank entfernt. Die Bearbeitung in DetailsView funktioniert auch in einer Weise, die mit der von GridView identisch ist.

Zum Einfügen wird dem Endbenutzer die Schaltfläche Neu angezeigt, die beim Klicken die DetailsView im "Einfügemodus" rendert. Im "Einfügemodus" wird die Schaltfläche Neu durch die Schaltflächen Einfügen und Abbrechen ersetzt, und es werden nur die BoundFields angezeigt, deren InsertVisible Eigenschaft auf True festgelegt ist (standard). Für Datenfelder, die als Felder mit automatischer Inkrementierung identifiziert werden, z ProductID. B. , ist die InsertVisible-Eigenschaft auf False festgelegt, wenn DetailsView über das Smarttag an die Datenquelle gebunden wird.

Beim Binden einer Datenquelle an eine DetailsView über das Smarttag legt Visual Studio die InsertVisible -Eigenschaft nur für Felder mit automatischer Inkrementierung fest False . Schreibgeschützte Felder wie CategoryName und SupplierNamewerden auf der Benutzeroberfläche des Einfügemodus angezeigt, es sei denn, ihre InsertVisible Eigenschaft ist explizit auf Falsefestgelegt. Nehmen Sie sich einen Moment Zeit, um die Eigenschaften dieser beiden Felder InsertVisible auf festzulegen False, entweder über die deklarative Syntax von DetailsView oder über den Link Felder bearbeiten im Smarttag. Abbildung 19 zeigt das Festlegen der InsertVisible Eigenschaften auf, False indem Sie auf den Link Felder bearbeiten klicken.

Screenshot: Fenster

Abbildung 19: Northwind Traders bietet jetzt Acme-Tee an (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Nachdem Sie die InsertVisible Eigenschaften festgelegt haben, zeigen Sie die Basics.aspx Seite in einem Browser an, und klicken Sie auf die Schaltfläche Neu. Abbildung 20 zeigt detailsView beim Hinzufügen eines neuen Getränks, Acme Tea, zu unserer Produktlinie.

Screenshot: DetailsView der seite

Abbildung 20: Northwind Traders bietet jetzt Acme-Tee an (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Nachdem Sie die Details für Acme Tea eingegeben und auf die Schaltfläche Einfügen geklickt haben, wird ein Postback ausgeführt, und der neue Datensatz wird der Products Datenbanktabelle hinzugefügt. Da diese DetailsView die Produkte in der Reihenfolge auflistet, mit der sie in der Datenbanktabelle vorhanden sind, müssen wir zum letzten Produkt wechseln, um das neue Produkt anzuzeigen.

Details zu Acme Tea

Abbildung 21: Details für Acme Tea (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Hinweis

Die CurrentMode-Eigenschaft von DetailsView gibt die angezeigte Schnittstelle an und kann einen der folgenden Werte aufweisen: Edit, Insertoder ReadOnly. Die DefaultMode-Eigenschaft gibt den Modus an, in den detailsView nach Abschluss einer Bearbeitung oder Einfügung zurückkehrt, und ist nützlich, um eine DetailsView anzuzeigen, die sich dauerhaft im Bearbeitungs- oder Einfügemodus befindet.

Die Point-and-Click-Funktionen zum Einfügen und Bearbeiten von DetailsView haben dieselben Einschränkungen wie gridView: Der Benutzer muss vorhandene CategoryID Werte und SupplierID über ein Textfeld eingeben; der Schnittstelle fehlt jede Validierungslogik. Alle Produktfelder, die keine Werte zulassen NULL oder keinen Standardwert auf Datenbankebene haben, müssen in die Einfügeschnittstelle eingeschlossen werden. Und so weiter.

Die Techniken, die wir in zukünftigen Artikeln zum Erweitern und Verbessern der Bearbeitungsoberfläche von GridView untersuchen, können auch auf die Bearbeitungs- und Einfügeschnittstellen des DetailsView-Steuerelements angewendet werden.

Verwenden der FormView für eine flexiblere Benutzeroberfläche zur Datenänderung

FormView bietet integrierte Unterstützung für das Einfügen, Bearbeiten und Löschen von Daten, aber da es Vorlagen anstelle von Feldern verwendet, gibt es keinen Ort, die BoundFields oder das CommandField hinzuzufügen, die von den GridView- und DetailsView-Steuerelementen zum Bereitstellen der Datenänderungsschnittstelle verwendet werden. Stattdessen müssen die Websteuerelemente zum Sammeln von Benutzereingaben beim Hinzufügen eines neuen Elements oder bearbeiten eines vorhandenen Elements zusammen mit den Schaltflächen Neu, Bearbeiten, Löschen, Einfügen, Aktualisieren und Abbrechen manuell den entsprechenden Vorlagen hinzugefügt werden. Glücklicherweise erstellt Visual Studio automatisch die erforderliche Schnittstelle, wenn die FormView über die Dropdownliste im Smarttag an eine Datenquelle gebunden wird.

Um diese Techniken zu veranschaulichen, fügen Sie zunächst Basics.aspx der Seite eine FormView hinzu, und binden Sie sie über das Smarttag von FormView an die bereits erstellte ObjectDataSource. Dadurch werden ein EditItemTemplate- , InsertItemTemplate- und ItemTemplate -Steuerelement für die FormView mit TextBox-Websteuerelementen zum Sammeln der Benutzereingaben und Schaltflächenwebsteuerelemente für die Schaltflächen Neu, Bearbeiten, Löschen, Einfügen, Aktualisieren und Abbrechen generiert. Darüber hinaus wird die FormView-Eigenschaft DataKeyNames auf das Primärschlüsselfeld (ProductID) des Objekts festgelegt, das von ObjectDataSource zurückgegeben wird. Aktivieren Sie abschließend die Option Paging aktivieren im Smarttag von FormView.

Im Folgenden wird das deklarative Markup für die FormViews dargestellt, ItemTemplate nachdem die FormView an objectDataSource gebunden wurde. Standardmäßig ist jedes Nicht-Boolesche Wertproduktfeld an die Text Eigenschaft eines Label Web-Steuerelements gebunden, während jedes boolesche Wertfeld (Discontinued) an die Checked -Eigenschaft eines deaktivierten CheckBox-Websteuerelements gebunden ist. Damit die Schaltflächen Neu, Bearbeiten und Löschen beim Klicken ein bestimmtes FormView-Verhalten auslösen, müssen ihre CommandName Werte unbedingt auf New, Editund Deletefestgelegt werden.

<asp:FormView ID="FormView1" runat="server" DataKeyNames="ProductID" DataSourceID="ObjectDataSource1" AllowPaging="True"> <EditItemTemplate> ... </EditItemTemplate> <InsertItemTemplate> ... </InsertItemTemplate> <ItemTemplate> ProductID: <asp:Label ID="ProductIDLabel" runat="server" Text='<%# Eval("ProductID") %>'></asp:Label><br /> ProductName: <asp:Label ID="ProductNameLabel" runat="server" Text='<%# Bind("ProductName") %>'> </asp:Label><br /> SupplierID: <asp:Label ID="SupplierIDLabel" runat="server" Text='<%# Bind("SupplierID") %>'> </asp:Label><br /> CategoryID: <asp:Label ID="CategoryIDLabel" runat="server" Text='<%# Bind("CategoryID") %>'> </asp:Label><br /> QuantityPerUnit: <asp:Label ID="QuantityPerUnitLabel" runat="server" Text='<%# Bind("QuantityPerUnit") %>'> </asp:Label><br /> UnitPrice: <asp:Label ID="UnitPriceLabel" runat="server" Text='<%# Bind("UnitPrice") %>'></asp:Label><br /> UnitsInStock: <asp:Label ID="UnitsInStockLabel" runat="server" Text='<%# Bind("UnitsInStock") %>'> </asp:Label><br /> UnitsOnOrder: <asp:Label ID="UnitsOnOrderLabel" runat="server" Text='<%# Bind("UnitsOnOrder") %>'> </asp:Label><br /> ReorderLevel: <asp:Label ID="ReorderLevelLabel" runat="server" Text='<%# Bind("ReorderLevel") %>'> </asp:Label><br /> Discontinued: <asp:CheckBox ID="DiscontinuedCheckBox" runat="server" Checked='<%# Bind("Discontinued") %>' Enabled="false" /><br /> CategoryName: <asp:Label ID="CategoryNameLabel" runat="server" Text='<%# Bind("CategoryName") %>'> </asp:Label><br /> SupplierName: <asp:Label ID="SupplierNameLabel" runat="server" Text='<%# Bind("SupplierName") %>'> </asp:Label><br /> <asp:LinkButton ID="EditButton" runat="server" CausesValidation="False" CommandName="Edit" Text="Edit"> </asp:LinkButton> <asp:LinkButton ID="DeleteButton" runat="server" CausesValidation="False" CommandName="Delete" Text="Delete"> </asp:LinkButton> <asp:LinkButton ID="NewButton" runat="server" CausesValidation="False" CommandName="New" Text="New"> </asp:LinkButton> </ItemTemplate> </asp:FormView>

Abbildung 22 zeigt die FormViews ItemTemplate , wenn sie über einen Browser angezeigt werden. Jedes Produktfeld wird mit den Schaltflächen Neu, Bearbeiten und Löschen unten aufgeführt.

Die Defaut FormView ItemTemplate Listen jedes Produktfeld zusammen mit den Schaltflächen

Abbildung 22: Defaut FormView ItemTemplate Listen Jedes Produktfeld zusammen mit den Schaltflächen "Neu", "Bearbeiten" und "Löschen" (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Wie bei GridView und DetailsView führt das Klicken auf die Schaltfläche Löschen oder auf ein beliebiges Button, LinkButton oder ImageButton,dessen CommandName Eigenschaft auf Delete festgelegt ist, zu einem Postback, füllt die ObjectDataSource-Elemente DeleteParameters basierend auf dem Wert von DataKeyNames FormView auf und ruft die ObjectDataSource-Methode auf Delete() .

Wenn auf die Schaltfläche Bearbeiten geklickt wird, wird ein Postback ausgeführt, und die Daten werden an das -Element zurückgegeben, das EditItemTemplatefür das Rendern der Bearbeitungsschnittstelle verantwortlich ist. Diese Schnittstelle enthält die Websteuerelemente zum Bearbeiten von Daten zusammen mit den Schaltflächen Aktualisieren und Abbrechen. Der von Visual Studio generierte Standard EditItemTemplate enthält eine Bezeichnung für alle Felder mit automatischer Inkrementierung (ProductID), ein TextBox-Element für jedes nicht boolesche Wertfeld und ein CheckBox-Element für jedes boolesche Wertfeld. Dieses Verhalten ähnelt den automatisch generierten BoundFields in den GridView- und DetailsView-Steuerelementen.

Hinweis

Ein kleines Problem bei der automatischen Generierung des EditItemTemplate von FormView besteht darin, dass TextBox-Websteuerelemente für schreibgeschützte Felder wie CategoryName und SupplierNamegerendert werden. In Kürze erfahren Sie, wie Sie dies berücksichtigen.

Die TextBox-Steuerelemente im -Steuerelement verfügen Text über EditItemTemplate eine bidirektionale Datenbindung an den Wert ihres entsprechenden Datenfelds. Die bidirektionale Datenbindung, die von <%# Bind("dataField") %>bezeichnet wird, führt die Datenbindung sowohl beim Binden von Daten an die Vorlage als auch beim Auffüllen der ObjectDataSource-Parameter zum Einfügen oder Bearbeiten von Datensätzen durch. Das heißt, wenn der Benutzer im auf die Schaltfläche ItemTemplateBearbeiten klickt, gibt die Bind() -Methode den angegebenen Datenfeldwert zurück. Nachdem der Benutzer seine Änderungen vorgenommen hat und auf Aktualisieren klickt, werden die zurückgesetzten Werte, die den mit Bind() angegebenen Datenfeldern entsprechen, auf die ObjectDataSource UpdateParametersangewendet. Alternativ ruft die unidirektionale Datenbindung, die von bezeichnet wird <%# Eval("dataField") %>, nur die Datenfeldwerte ab, wenn Daten an die Vorlage gebunden werden, und gibt die vom Benutzer eingegebenen Werte nicht an die Parameter der Datenquelle beim Postback zurück.

Das folgende deklarative Markup zeigt das FormView-Element EditItemTemplate. Beachten Sie, dass die Bind() -Methode hier in der Datenbindungssyntax verwendet wird und dass die Eigenschaften für die Websteuerelemente Schaltflächen aktualisieren und abbrechen entsprechend festgelegt sind CommandName .

<asp:FormView ID="FormView1" runat="server" DataKeyNames="ProductID" DataSourceID="ObjectDataSource1" AllowPaging="True"> <EditItemTemplate> ProductID: <asp:Label ID="ProductIDLabel1" runat="server" Text="<%# Eval("ProductID") %>"></asp:Label><br /> ProductName: <asp:TextBox ID="ProductNameTextBox" runat="server" Text="<%# Bind("ProductName") %>"> </asp:TextBox><br /> SupplierID: <asp:TextBox ID="SupplierIDTextBox" runat="server" Text="<%# Bind("SupplierID") %>"> </asp:TextBox><br /> CategoryID: <asp:TextBox ID="CategoryIDTextBox" runat="server" Text="<%# Bind("CategoryID") %>"> </asp:TextBox><br /> QuantityPerUnit: <asp:TextBox ID="QuantityPerUnitTextBox" runat="server" Text="<%# Bind("QuantityPerUnit") %>"> </asp:TextBox><br /> UnitPrice: <asp:TextBox ID="UnitPriceTextBox" runat="server" Text="<%# Bind("UnitPrice") %>"> </asp:TextBox><br /> UnitsInStock: <asp:TextBox ID="UnitsInStockTextBox" runat="server" Text="<%# Bind("UnitsInStock") %>"> </asp:TextBox><br /> UnitsOnOrder: <asp:TextBox ID="UnitsOnOrderTextBox" runat="server" Text="<%# Bind("UnitsOnOrder") %>"> </asp:TextBox><br /> ReorderLevel: <asp:TextBox ID="ReorderLevelTextBox" runat="server" Text="<%# Bind("ReorderLevel") %>"> </asp:TextBox><br /> Discontinued: <asp:CheckBox ID="DiscontinuedCheckBox" runat="server" Checked="<%# Bind("Discontinued") %>" /><br /> CategoryName: <asp:TextBox ID="CategoryNameTextBox" runat="server" Text="<%# Bind("CategoryName") %>"> </asp:TextBox><br /> SupplierName: <asp:TextBox ID="SupplierNameTextBox" runat="server" Text="<%# Bind("SupplierName") %>"> </asp:TextBox><br /> <asp:LinkButton ID="UpdateButton" runat="server" CausesValidation="True" CommandName="Update" Text="Update"> </asp:LinkButton> <asp:LinkButton ID="UpdateCancelButton" runat="server" CausesValidation="False" CommandName="Cancel" Text="Cancel"> </asp:LinkButton> </EditItemTemplate> <InsertItemTemplate> ... </InsertItemTemplate> <ItemTemplate> ... </ItemTemplate> </asp:FormView>

Unser EditItemTemplateführt zu diesem Zeitpunkt dazu, dass eine Ausnahme ausgelöst wird, wenn wir versuchen, sie zu verwenden. Das Problem besteht darin, dass die CategoryName Felder und SupplierName als TextBox-Websteuerelemente im EditItemTemplategerendert werden. Wir müssen diese TextBoxes entweder in Bezeichnungen ändern oder ganz entfernen. Löschen Wir sie einfach vollständig aus dem EditItemTemplate.

Abbildung 23 zeigt die FormView in einem Browser, nachdem für Chai auf die Schaltfläche Bearbeiten geklickt wurde. Beachten Sie, dass die SupplierName in ItemTemplate der angezeigten Felder und CategoryName nicht mehr vorhanden sind, da wir sie gerade aus dem EditItemTemplateentfernt haben. Wenn auf die Schaltfläche Aktualisieren geklickt wird, durchläuft die FormView dieselbe Schrittfolge wie die Steuerelemente GridView und DetailsView.

Die EditItemTemplate zeigt standardmäßig jedes bearbeitbare Produktfeld als TextBox oder CheckBox an.

Abbildung 23: Standardmäßig zeigt jedes EditItemTemplate bearbeitbare Produktfeld als TextBox oder CheckBox an (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Wenn auf die Schaltfläche Einfügen geklickt wird, wird ein Postback des FormView-Steuerelements ItemTemplate ausgeführt. Es sind jedoch keine Daten an die FormView gebunden, da ein neuer Datensatz hinzugefügt wird. Die InsertItemTemplate Schnittstelle enthält die Websteuerelemente zum Hinzufügen eines neuen Datensatzes zusammen mit den Schaltflächen Einfügen und Abbrechen. Der von Visual Studio generierte Standard InsertItemTemplate enthält ein TextBox-Element für jedes nicht boolesche Wertfeld und ein CheckBox-Element für jedes boolesche Wertfeld, ähnlich der automatisch generierten EditItemTemplate-Schnittstelle. Die TextBox-Steuerelemente verfügen über eine Text Eigenschaft, die mithilfe der bidirektionalen Datenbindung an den Wert ihres entsprechenden Datenfelds gebunden ist.

Das folgende deklarative Markup zeigt das FormView-Element InsertItemTemplate. Beachten Sie, dass die Bind() -Methode hier in der Datenbindungssyntax verwendet wird und dass die Eigenschaften der Websteuerelemente Schaltfläche einfügen und Abbrechen entsprechend festgelegt sind CommandName .

<asp:FormView ID="FormView1" runat="server" DataKeyNames="ProductID" DataSourceID="ObjectDataSource1" AllowPaging="True"> <EditItemTemplate> ... </EditItemTemplate> <InsertItemTemplate> ProductName: <asp:TextBox ID="ProductNameTextBox" runat="server" Text="<%# Bind("ProductName") %>"> </asp:TextBox><br /> SupplierID: <asp:TextBox ID="SupplierIDTextBox" runat="server" Text="<%# Bind("SupplierID") %>"> </asp:TextBox><br /> CategoryID: <asp:TextBox ID="CategoryIDTextBox" runat="server" Text="<%# Bind("CategoryID") %>"> </asp:TextBox><br /> QuantityPerUnit: <asp:TextBox ID="QuantityPerUnitTextBox" runat="server" Text="<%# Bind("QuantityPerUnit") %>"> </asp:TextBox><br /> UnitPrice: <asp:TextBox ID="UnitPriceTextBox" runat="server" Text="<%# Bind("UnitPrice") %>"> </asp:TextBox><br /> UnitsInStock: <asp:TextBox ID="UnitsInStockTextBox" runat="server" Text="<%# Bind("UnitsInStock") %>"> </asp:TextBox><br /> UnitsOnOrder: <asp:TextBox ID="UnitsOnOrderTextBox" runat="server" Text="<%# Bind("UnitsOnOrder") %>"> </asp:TextBox><br /> ReorderLevel: <asp:TextBox ID="ReorderLevelTextBox" runat="server" Text="<%# Bind("ReorderLevel") %>"> </asp:TextBox><br /> Discontinued: <asp:CheckBox ID="DiscontinuedCheckBox" runat="server" Checked="<%# Bind("Discontinued") %>" /><br /> CategoryName: <asp:TextBox ID="CategoryNameTextBox" runat="server" Text="<%# Bind("CategoryName") %>"> </asp:TextBox><br /> SupplierName: <asp:TextBox ID="SupplierNameTextBox" runat="server" Text="<%# Bind("SupplierName") %>"> </asp:TextBox><br /> <asp:LinkButton ID="InsertButton" runat="server" CausesValidation="True" CommandName="Insert" Text="Insert"> </asp:LinkButton> <asp:LinkButton ID="InsertCancelButton" runat="server" CausesValidation="False" CommandName="Cancel" Text="Cancel"> </asp:LinkButton> </InsertItemTemplate> <ItemTemplate> ... </ItemTemplate> </asp:FormView>

Es gibt eine Subtilität mit der automatischen Generierung von von FormView.InsertItemTemplate Insbesondere werden die TextBox-Websteuerelemente auch für die schreibgeschützten Felder erstellt, z CategoryName . B. und SupplierName. Wie bei EditItemTemplatemüssen wir diese TextBoxes aus dem InsertItemTemplateentfernen.

Abbildung 24 zeigt die FormView in einem Browser beim Hinzufügen eines neuen Produkts, Acme Coffee. Beachten Sie, dass die SupplierName in ItemTemplate der angezeigten Felder und CategoryName nicht mehr vorhanden sind, da wir sie gerade entfernt haben. Wenn auf die Schaltfläche Einfügen geklickt wird, durchläuft die FormView dieselbe Schrittfolge wie das DetailsView-Steuerelement und fügt der Products Tabelle einen neuen Datensatz hinzu. Abbildung 25 zeigt die Details des Acme Coffee-Produkts in formView, nachdem es eingefügt wurde.

InsertItemTemplate diktiert die Einfügeschnittstelle der FormView.

Abbildung 24: Diktiert InsertItemTemplate die Einfügeschnittstelle der FormView (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Die Details für das neue Produkt Acme Coffee werden in der FormView angezeigt.

Abbildung 25: Die Details für das neue Produkt Acme Coffee werden in der FormView angezeigt (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Durch das Trennen der schreibgeschützten, bearbeitungsgeschützten und einfügenden Schnittstellen in drei separate Vorlagen ermöglicht die FormView eine feinere Kontrolle über diese Schnittstellen als DetailsView und GridView.

Hinweis

Wie die DetailsView gibt die FormView-Eigenschaft CurrentMode die angezeigte Schnittstelle an, und ihre DefaultMode Eigenschaft gibt den Modus an, in den die FormView nach abschluss einer Bearbeitung oder Einfügung zurückkehrt.

Zusammenfassung

In diesem Tutorial haben wir die Grundlagen des Einfügens, Bearbeitens und Löschens von Daten mithilfe von GridView, DetailsView und FormView untersucht. Alle drei dieser Steuerelemente bieten eine Reihe von integrierten Datenänderungsfunktionen, die dank der Datenwebsteuerelemente und objectDataSource verwendet werden können, ohne eine einzige Codezeile auf der seite ASP.NET zu schreiben. Die einfachen Point-and-Click-Techniken rendern jedoch eine ziemlich gebrechlich und naive Benutzeroberfläche zur Datenänderung. Um eine Validierung bereitzustellen, programmgesteuerte Werte einzugeben, Ausnahmen ordnungsgemäß zu behandeln, die Benutzeroberfläche anzupassen usw., müssen wir uns auf eine Vielzahl von Techniken verlassen, die in den nächsten Tutorials behandelt werden.

Viel Spaß beim Programmieren!

Zum Autor

Scott Mitchell, Autor von sieben ASP/ASP.NET-Büchern und Gründer von 4GuysFromRolla.com, arbeitet seit 1998 mit Microsoft-Webtechnologien. Scott arbeitet als unabhängiger Berater, Trainer und Autor. Sein neuestes Buch ist Sams Teach Yourself ASP.NET 2.0 in 24 Hours. Er kann unter mitchell@4GuysFromRolla.comoder über seinen Blog erreicht werden, der unter http://ScottOnWriting.NETzu finden ist.