Master-/Detailfilterung über zwei Seiten mit einem Repeater-Steuerelement und DataList (VB)
von Scott Mitchell
In diesem Tutorial erfahren Sie, wie Sie einen master-/Detailbericht auf zwei Seiten trennen. Auf der Seite "master" verwenden wir ein Repeater-Steuerelement, um eine Liste von Kategorien zu rendern, die den Benutzer beim Klicken auf die Seite "Details" bringt, auf der eine zweispaltige DataList die Produkte anzeigt, die zur ausgewählten Kategorie gehören.
Einführung
Im Tutorial Master-/Detailfilterung über zwei Seiten haben wir dieses Muster mithilfe einer GridView untersucht, um alle Lieferanten im System anzuzeigen. Diese GridView enthält ein HyperLinkField, das als Link zu einer zweiten Seite gerendert wird und in SupplierID
der Abfragezeichenfolge übergeben wird. Auf der zweiten Seite wurde eine GridView verwendet, um die vom ausgewählten Lieferanten bereitgestellten Produkte aufzulisten.
Solche zweiseitigen master/Detailberichte können auch mithilfe von DataList- und Repeater-Steuerelementen ausgeführt werden. Der einzige Unterschied besteht darin, dass weder die DataList noch der Repeater Unterstützung für das HyperLinkField-Steuerelement bieten. Stattdessen müssen wir ein HyperLink-Websteuerelement oder ein Anker-HTML-Element (<a>
) innerhalb des Steuerelements ItemTemplate
hinzufügen. Die HyperLink-Eigenschaft NavigateUrl
oder das Attribut des Ankers href
kann dann mithilfe deklarativer oder programmgesteuerter Ansätze angepasst werden.
In diesem Tutorial untersuchen wir ein Beispiel, das die Kategorien in einer Aufzählungsliste auf einer Seite mit einem Repeater-Steuerelement auflistet. Jedes Listenelement enthält den Namen und die Beschreibung der Kategorie, wobei der Kategoriename als Link zu einer zweiten Seite angezeigt wird. Wenn Sie auf diesen Link klicken, gelangen Sie zur zweiten Seite, auf der eine DataList die Produkte anzeigt, die zur ausgewählten Kategorie gehören.
Schritt 1: Anzeigen der Kategorien in einer Aufzählung
Der erste Schritt beim Erstellen eines master-/Detailberichts besteht darin, mit der Anzeige der "master"-Datensätze zu beginnen. Daher besteht unsere erste Aufgabe darin, die Kategorien auf der Seite "master" anzuzeigen. Öffnen Sie die CategoryListMaster.aspx
Seite im DataListRepeaterFiltering
Ordner, fügen Sie ein Repeater-Steuerelement hinzu, und fügen Sie über das Smarttag eine neue ObjectDataSource hinzu. Konfigurieren Sie die neue ObjectDataSource so, dass sie über die Methode der Klasse GetCategories
auf ihre CategoriesBLL
Daten zugreift (siehe Abbildung 1).
Abbildung 1: Konfigurieren der ObjectDataSource für die Verwendung der -Methode der CategoriesBLL
Klasse GetCategories
(Klicken Sie hier, um das bild in voller Größe anzuzeigen)
Definieren Sie als Nächstes die Vorlagen des Repeaters so, dass jeder Kategoriename und jede Beschreibung als Element in einer Aufzählung angezeigt wird. Wir müssen uns noch keine Gedanken darüber machen, dass jeder Kategorielink zur Detailseite angezeigt wird. Im Folgenden wird das deklarative Markup für den Repeater und ObjectDataSource veranschaulicht:
<asp:Repeater ID="Repeater1" runat="server" DataSourceID="ObjectDataSource1"
EnableViewState="False">
<HeaderTemplate>
<ul>
</HeaderTemplate>
<ItemTemplate>
<li><%# Eval("CategoryName") %> - <%# Eval("Description") %></li>
</ItemTemplate>
<FooterTemplate>
</ul>
</FooterTemplate>
</asp:Repeater>
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
OldValuesParameterFormatString="original_{0}"
SelectMethod="GetCategories" TypeName="CategoriesBLL">
</asp:ObjectDataSource>
Wenn dieses Markup abgeschlossen ist, nehmen Sie sich einen Moment Zeit, um unseren Fortschritt über einen Browser anzuzeigen. Wie Abbildung 2 zeigt, wird der Repeater als Aufzählungsliste gerendert, die den Namen und die Beschreibung jeder Kategorie anzeigt.
Abbildung 2: Jede Kategorie wird als Aufzählungselement angezeigt (Klicken Sie hier, um das Bild in voller Größe anzuzeigen).
Schritt 2: Umwandeln des Kategorienamens in einen Link zur Detailseite
Damit ein Benutzer die "Details"-Informationen für eine bestimmte Kategorie anzeigen kann, müssen wir jedem Aufzählungselement einen Link hinzufügen, der den Benutzer beim Klicken auf die zweite Seite (ProductsForCategoryDetails.aspx
) bringt. Auf dieser zweiten Seite werden dann die Produkte für die ausgewählte Kategorie mithilfe einer DataList angezeigt. Um die Kategorie zu ermitteln, auf deren Link geklickt wurde, müssen wir die angeklickten Kategorien CategoryID
über einen Mechanismus an die zweite Seite übergeben. Die einfachste und einfachste Möglichkeit zum Übertragen skalarer Daten von einer Seite auf eine andere ist die Abfragezeichenfolge, die in diesem Tutorial verwendet wird. Insbesondere erwartet die ProductsForCategoryDetails.aspx
Seite, dass der ausgewählte categoryID
Wert über ein Abfragezeichenfolgenfeld mit dem Namen CategoryID
übergeben wird. Um beispielsweise die Produkte für die Kategorie Getränke anzuzeigen, die eine CategoryID
von 1 aufweist, würde ein Benutzer besuchen ProductsForCategoryDetails.aspx?CategoryID=1
.
Um einen Link für jedes Aufzählungselement im Repeater zu erstellen, müssen sie entweder ein HyperLink-Websteuerelement oder ein HTML-Ankerelement (<a>
) hinzufügen ItemTemplate
. In Szenarien, in denen der Hyperlink für jede Zeile gleich angezeigt wird, reicht jeder Ansatz aus. Für Repeater bevorzuge ich das Ankerelement. Um das Ankerelement zu verwenden, aktualisieren Sie die ItemTemplate des Repeaters auf:
<li>
<a href='ProductsForCategoryDetails.aspx?CategoryID=<%# Eval("CategoryID") %>'>
<%# Eval("CategoryName") %>
</a> - <%# Eval("Description") %>
</li>
Beachten Sie, dass der CategoryID
direkt in das Attribut des Ankerelements href
eingefügt werden kann. Stellen Sie jedoch sicher, dass der Wert des href
Attributs durch Apostrophe (und Anführungszeichen) begrenzt wird, da die Eval
-Methode innerhalb des href
Attributs ihre Zeichenfolge ("CategoryID"
) mit Anführungszeichen begrenzt. Alternativ kann stattdessen ein HyperLink-Websteuerelement verwendet werden:
<li>
<asp:HyperLink runat="server" Text='<%# Eval("CategoryName") %>'
NavigateUrl='<%# "ProductsForCategoryDetails.aspx?CategoryID=" &
Eval("CategoryID") %>'>
</asp:HyperLink>
- <%# Eval("Description") %>
</li>
Beachten Sie, wie der statische Teil der URL — ProductsForCategoryDetails.aspx?CategoryID
direkt innerhalb der Datenbindungssyntax mithilfe von Eval("CategoryID")
Zeichenfolgenverkettung an das Ergebnis angefügt wird.
Ein Vorteil der Verwendung des HyperLink-Steuerelements ist, dass bei Bedarf programmgesteuert über den Ereignishandler des ItemDataBound
Repeaters darauf zugegriffen werden kann. Beispielsweise können Sie den Kategorienamen als Text und nicht als Link für Kategorien ohne zugeordnete Produkte anzeigen. Eine solche Überprüfung kann programmgesteuert im ItemDataBound
Ereignishandler durchgeführt werden. Für Kategorien ohne zugehörige Produkte könnte die HyperLink-Eigenschaft NavigateUrl
auf eine leere Zeichenfolge festgelegt werden, was dazu führt, dass dieser bestimmte Kategoriename als Nur-Text (statt als Link) gerendert wird. Weitere Informationen zum Formatieren der DataList- und Repeater-Inhalte basierend auf Daten finden Sie im Tutorial Formatieren der DataList und des Repeaters basierend auf programmgesteuerter Logik über den ItemDataBound
Ereignishandler.
Wenn Sie folgen, können Sie entweder das Ankerelement oder den HyperLink-Steuerelementansatz auf Ihrer Seite verwenden. Unabhängig vom Ansatz sollte beim Anzeigen der Seite über einen Browser jeder Kategoriename als Link zu gerendert werden, indem ProductsForCategoryDetails.aspx
der entsprechende CategoryID
Wert übergeben wird (siehe Abbildung 3).
Abbildung 3: Die Kategorienamen jetzt mit ProductsForCategoryDetails.aspx
verknüpfen (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)
Schritt 3: Auflisten der Produkte, die zur ausgewählten Kategorie gehören
Nachdem die CategoryListMaster.aspx
Seite abgeschlossen ist, sind wir bereit, unsere Aufmerksamkeit auf die Implementierung der Seite "Details" ProductsForCategoryDetails.aspx
zu richten. Öffnen Sie diese Seite, ziehen Sie eine DataList aus der Toolbox auf die Designer, und legen Sie die ID
-Eigenschaft auf festProductsInCategory
. Wählen Sie als Nächstes aus dem Smarttag der DataList aus, um der Seite eine neue ObjectDataSource hinzuzufügen, und nennen Sie sie ProductsInCategoryDataSource
. Konfigurieren Sie sie so, dass die Methode der ProductsBLL
Klasse GetProductsByCategoryID(categoryID)
aufgerufen wird. Legen Sie die Dropdownlisten in den Registerkarten INSERT, UPDATE und DELETE auf (Keine) fest.
Abbildung 4: Konfigurieren der ObjectDataSource für die Verwendung der Methode der ProductsBLL
Klasse GetProductsByCategoryID(categoryID)
(Klicken Sie hier, um das bild in voller Größe anzuzeigen)
Da die GetProductsByCategoryID(categoryID)
Methode einen Eingabeparameter akzeptiert (categoryID
), bietet uns der Assistent Datenquelle auswählen die Möglichkeit, die Quelle des Parameters anzugeben. Legen Sie die Parameterquelle mithilfe von QueryStringField auf QueryString fest CategoryID
.
Abbildung 5: Verwenden Sie das Querystring-Feld CategoryID
als Quelle des Parameters (Klicken Sie hier, um das bild in voller Größe anzuzeigen)
Wie wir in den vorherigen Tutorials gesehen haben, erstellt Visual Studio nach Abschluss des Assistenten Datenquelle auswählen automatisch einen ItemTemplate
für die DataList, in dem jeder Datenfeldname und -wert aufgelistet ist. Ersetzen Sie diese Vorlage durch eine Vorlage, die nur den Namen, den Lieferanten und den Preis des Produkts auflistet. Legen Sie außerdem die DataList-Eigenschaft RepeatColumns
auf 2 fest. Nach diesen Änderungen sollte das deklarative Markup Von DataList und ObjectDataSource wie folgt aussehen:
<asp:DataList ID="ProductsInCategory" DataKeyField="ProductID" RepeatColumns="2"
DataSourceID="ProductsInCategoryDataSource" EnableViewState="False"
runat="server">
<ItemTemplate>
<h5><%# Eval("ProductName") %></h5>
<p>
Supplied by <%# Eval("SupplierName") %><br />
<%# Eval("UnitPrice", "{0:C}") %>
</p>
</ItemTemplate>
</asp:DataList>
<asp:ObjectDataSource ID="ProductsInCategoryDataSource"
OldValuesParameterFormatString="original_{0}" runat="server"
SelectMethod="GetProductsByCategoryID" TypeName="ProductsBLL">
<SelectParameters>
<asp:QueryStringParameter Name="categoryID" QueryStringField="CategoryID"
Type="Int32" />
</SelectParameters>
</asp:ObjectDataSource>
Um diese Seite in Aktion anzuzeigen, beginnen Sie von der CategoryListMaster.aspx
Seite. Klicken Sie als Nächstes auf einen Link in der Liste Kategorien mit Aufzählungszeichen. Dies führt Sie zu ProductsForCategoryDetails.aspx
, indem Sie die CategoryID
Abfragezeichenfolge durchlaufen. Die ProductsInCategoryDataSource
ObjectDataSource in ProductsForCategoryDetails.aspx
ruft dann nur diese Produkte für die angegebene Kategorie ab und zeigt sie in der DataList an, wodurch zwei Produkte pro Zeile gerendert werden. Abbildung 6 zeigt einen Screenshot der Anzeige der ProductsForCategoryDetails.aspx
Getränke.
Abbildung 6: Die Getränke werden angezeigt, zwei pro Zeile (Klicken Sie hier, um das bild in voller Größe anzuzeigen)
Schritt 4: Anzeigen von Kategorieinformationen auf ProductsForCategoryDetails.aspx
Wenn ein Benutzer auf eine Kategorie in CategoryListMaster.aspx
klickt, wird er zu ProductsForCategoryDetails.aspx
den Produkten weitergeleitet, die zur ausgewählten Kategorie gehören. Es gibt jedoch keine visuellen Hinweise darauf, ProductsForCategoryDetails.aspx
welche Kategorie ausgewählt wurde. Ein Benutzer, der auf Getränke klicken wollte, aber versehentlich auf Würzmittel geklickt hat, hat keine Möglichkeit, seinen Fehler zu erkennen, sobald er erreicht ProductsForCategoryDetails.aspx
. Um dieses potenzielle Problem zu beheben, können wir oben auf der Seite Informationen zur ausgewählten Kategorie anzeigen – ihren Namen und ihre ProductsForCategoryDetails.aspx
Beschreibung.
Fügen Sie dazu eine FormView über dem Repeater-Steuerelement in ProductsForCategoryDetails.aspx
hinzu. Fügen Sie als Nächstes der Seite aus dem Smarttag CategoryDataSource
der FormView eine neue ObjectDataSource hinzu, und konfigurieren Sie es so, dass die Methode der CategoriesBLL
Klasse GetCategoryByCategoryID(categoryID)
verwendet wird.
Abbildung 7: Zugreifen auf Informationen zur Kategorie über die Methode der CategoriesBLL
Klasse GetCategoryByCategoryID(categoryID)
(Klicken Sie hier, um das bild in voller Größe anzuzeigen)
Wie bei der ProductsInCategoryDataSource
in Schritt 3 hinzugefügten ObjectDataSource fordert uns der CategoryDataSource
Assistent Datenquelle konfigurieren nach einer Quelle für den Eingabeparameter der GetCategoryByCategoryID(categoryID)
Methode auf. Verwenden Sie die gleichen Einstellungen wie zuvor, und legen Sie die Parameterquelle auf QueryString und den QueryStringField-Wert auf fest CategoryID
(siehe Abbildung 5).
Nach Abschluss des Assistenten erstellt Visual Studio automatisch ein ItemTemplate
, EditItemTemplate
und InsertItemTemplate
für die FormView. Da wir eine schreibgeschützte Benutzeroberfläche bereitstellen, können Sie und EditItemTemplate
InsertItemTemplate
entfernen. Außerdem können Sie die FormView anpassen ItemTemplate
. Nach dem Entfernen der überflüssigen Vorlagen und dem Anpassen der ItemTemplate sollte das deklarative Markup Ihres FormView- und ObjectDataSource-Markups wie folgt aussehen:
<asp:FormView ID="FormView1" runat="server" DataKeyNames="CategoryID"
DataSourceID="CategoryDataSource" EnableViewState="False" Width="100%">
<ItemTemplate>
<h3>
<asp:Label ID="CategoryNameLabel" runat="server"
Text='<%# Bind("CategoryName") %>' />
</h3>
<p>
<asp:Label ID="DescriptionLabel" runat="server"
Text='<%# Bind("Description") %>' />
</p>
</ItemTemplate>
</asp:FormView>
<asp:ObjectDataSource ID="CategoryDataSource" runat="server"
OldValuesParameterFormatString="original_{0}"
SelectMethod="GetCategoryByCategoryID" TypeName="CategoriesBLL">
<SelectParameters>
<asp:QueryStringParameter Name="categoryID" Type="Int32"
QueryStringField="CategoryID" />
</SelectParameters>
</asp:ObjectDataSource>
Abbildung 8 zeigt einen Screenshot beim Anzeigen dieser Seite über einen Browser.
Hinweis
Zusätzlich zur FormView habe ich auch ein HyperLink-Steuerelement über der FormView hinzugefügt, das den Benutzer zurück in die Liste der Kategorien (CategoryListMaster.aspx
) bringt. Sie können diesen Link an anderer Stelle platzieren oder ganz weglassen.
Abbildung 8: Kategorieinformationen werden jetzt oben auf der Seite angezeigt (Klicken Sie hier, um das bild in voller Größe anzuzeigen)
Schritt 5: Anzeigen einer Meldung, wenn keine Produkte zur ausgewählten Kategorie gehören
Die CategoryListMaster.aspx
Seite listet alle Kategorien im System auf, unabhängig davon, ob es zugehörige Produkte gibt. Wenn ein Benutzer auf eine Kategorie ohne zugehörige Produkte klickt, wird die DataList in ProductsForCategoryDetails.aspx
nicht gerendert, da die Datenquelle keine Elemente enthält. Wie wir in früheren Tutorials gesehen haben, stellt GridView eine EmptyDataText
Eigenschaft bereit, die verwendet werden kann, um eine TEXTnachricht anzugeben, die angezeigt werden soll, wenn keine Datensätze in der Datenquelle vorhanden sind. Leider verfügt weder die DataList noch der Repeater über eine solche Eigenschaft.
Um eine Meldung anzuzeigen, die den Benutzer darüber informiert, dass es keine übereinstimmenden Produkte für die ausgewählte Kategorie gibt, müssen wir ein Label-Steuerelement zur Seite hinzufügen, deren Text
Eigenschaft die Meldung zugewiesen ist, die angezeigt werden soll, falls keine übereinstimmenden Produkte vorhanden sind. Anschließend müssen wir die Eigenschaft programmgesteuert festlegen Visible
, je nachdem, ob die DataList Elemente enthält oder nicht.
Um dies zu erreichen, fügen Sie zunächst eine Bezeichnung unter der DataList hinzu. Legen Sie die ID
-Eigenschaft auf NoProductsMessage
und die Text
-Eigenschaft auf "Es gibt keine Produkte für die ausgewählte Kategorie..." fest. Als Nächstes Visible
müssen wir die Eigenschaft dieser Bezeichnung programmgesteuert festlegen, basierend darauf, ob Daten an die ProductsInCategory
DataList gebunden waren oder nicht. Diese Zuweisung muss erfolgen, nachdem die Daten an die DataList gebunden wurden. Für GridView, DetailsView und FormView könnten wir einen Ereignishandler für das Ereignis des Steuerelements DataBound
erstellen, der nach Abschluss der Datenbindung ausgelöst wird. Weder für dataList noch für den Repeater ist jedoch ein DataBound
Ereignis verfügbar.
In diesem speziellen Beispiel können wir die Label-Eigenschaft Visible
im Page_Load
Ereignishandler zuweisen, da die Daten der DataList vor dem Ereignis der Seite Load
zugewiesen wurden. Dieser Ansatz funktioniert jedoch im allgemeinen Fall nicht, da die Daten aus der ObjectDataSource später im Lebenszyklus der Seite möglicherweise an die DataList gebunden werden. Wenn die angezeigten Daten beispielsweise auf dem Wert in einem anderen Steuerelement basieren, z. B. beim Anzeigen eines master-/Detailberichts mithilfe einer DropDownList zum Speichern der "master"-Datensätze, werden die Daten möglicherweise erst in der Phase des Lebenszyklus der Seite an das PreRender
Datenwebsteuerelement zurückgegeben.
Eine Lösung, die für alle Fälle funktioniert, besteht darin, die Visible
-Eigenschaft im DataList-Ereignishandler ItemDataBound
(oder ItemCreated
) zuzuweisenFalse
, wenn ein Elementtyp von Item
oder AlternatingItem
gebunden wird. In einem solchen Fall wissen wir, dass mindestens ein Datenelement in der Datenquelle vorhanden ist und daher die NoProductsMessage
Bezeichnung ausgeblendet werden kann. Zusätzlich zu diesem Ereignishandler benötigen wir auch einen Ereignishandler für das DataList-Ereignis DataBinding
, bei dem wir die Label-Eigenschaft Visible
mit True
initialisieren. Da das DataBinding
Ereignis vor den ItemDataBound
Ereignissen ausgelöst wird, wird die Label-Eigenschaft Visible
zunächst auf True
festgelegt. Wenn Datenelemente vorhanden sind, wird sie jedoch auf False
festgelegt. Der folgende Code implementiert diese Logik:
Protected Sub ProductsInCategory_DataBinding(sender As Object, e As EventArgs) _
Handles ProductsInCategory.DataBinding
'Show the Label
NoProductsMessage.Visible = True
End Sub
Protected Sub ProductsInCategory_ItemDataBound(s As Object, e As DataListItemEventArgs) _
Handles ProductsInCategory.ItemDataBound
'If we have a data item, hide the Label
If e.Item.ItemType = ListItemType.Item OrElse e.Item.ItemType = _
ListItemType.AlternatingItem Then
NoProductsMessage.Visible = False
End If
End Sub
Alle Kategorien in der Northwind-Datenbank sind einem oder mehreren Produkten zugeordnet. Um dieses Feature zu testen, habe ich die Northwind-Datenbank für dieses Tutorial manuell angepasst und alle Produkte, die der Kategorie Produkte (CategoryID
= 7) zugeordnet sind, der Kategorie Meeresfrüchte (CategoryID
= 8) neu zugewiesen. Dies kann über die Server-Explorer erreicht werden, indem Sie Neue Abfrage auswählen und die folgende UPDATE
Anweisung verwenden:
UPDATE Products SET
CategoryID = 8
WHERE CategoryID = 7
Nachdem Sie die Datenbank entsprechend aktualisiert haben, kehren Sie zur CategoryListMaster.aspx
Seite zurück, und klicken Sie auf den Link Erstellen. Da es keine Produkte mehr gibt, die zur Kategorie Produkte gehören, sollte die Option "Es gibt keine Produkte für die ausgewählte Kategorie..." angezeigt werden. -Meldung, wie in Abbildung 9 dargestellt.
Abbildung 9: Eine Meldung wird angezeigt, wenn keine Produkte zur ausgewählten Kategorie gehören (Klicken Sie, um das Bild in voller Größe anzuzeigen)
Zusammenfassung
Während master-/Detailberichte sowohl die master- als auch Detaildatensätze auf einer einzelnen Seite anzeigen können, sind sie auf vielen Websites auf zwei Webseiten getrennt. In diesem Tutorial haben wir uns mit der Implementierung eines solchen master-/Detailberichts befasst, indem die Kategorien in einer Aufzählungsliste mit einem Repeater auf der "master"-Webseite und den zugehörigen Produkten auf der Seite "Details" aufgeführt sind. Jedes Listenelement auf der master-Webseite enthielt einen Link zur Detailseite, die den Zeilenwert CategoryID
übergeben hat.
Auf der Detailseite wurde das Abrufen dieser Produkte für den angegebenen Lieferanten über die Methode der ProductsBLL
Klasse GetProductsByCategoryID(categoryID)
durchgeführt. Der categoryID
Parameterwert wurde deklarativ unter Verwendung des CategoryID
Querystring-Werts als Parameterquelle angegeben. Außerdem wurde untersucht, wie Sie Kategoriedetails auf der Detailseite mithilfe einer FormView anzeigen und eine Meldung anzeigen, wenn keine Produkte zur ausgewählten Kategorie gehören.
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 Stunden. Er kann unter mitchell@4GuysFromRolla.comoder über seinen Blog erreicht werden, der unter http://ScottOnWriting.NETzu finden ist.
Besonderen Dank an...
Diese Tutorialreihe wurde von vielen hilfreichen Prüfern überprüft. Hauptprüfer für dieses Tutorial waren Zack Jones und Liz Shulok. Möchten Sie meine anstehenden MSDN-Artikel lesen? Wenn dies der Fall ist, legen Sie eine Zeile unter abmitchell@4GuysFromRolla.com.
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für